Kurz und gut - Episode #06 Nützliche Nutzerverwaltung: MySQL User Attribute
Ich werde in Seminaren, Workshops oder in Kundenprojekten in Sachen MySQL immer mal wieder mit Dingen konfrontiert, auf die ich ad hoc keine Antwort habe, bzw. mit denen ich noch keine Erfahrung gesammelt habe.
Das Problem
Eigentlich handelt es sich bei der heutigen Frage um kein echtes Problem. Einem Schulungsteilnehmer ist die Spalte „user_attributes“ in der Systemtabelle „mysql.user“ aufgefallen und er hat gefragt, wozu man diese in der Praxis nutzen kann.
Die Lösung
Die Spalte (übrigens von Datentyp „JSON“) kann verwendet werden, um Benutzerkonten näher zu kategorisieren und/oder zu beschreiben. So können weitere zusätzliche Informationen zu den Usern zentral gespeichert und natürlich auch genutzt werden.
In unserem kleinen Beispiel wollen wir zu den User-Accounts zwei zusätzliche Informationen hinterlegen:
- Abteilung in welcher der User arbeitet
- Bedeutung/Wichtigkeit des Users in der Organisation und der DB, um z. B. im Fall von Performance-Problemen bestimmte User-Accounts zu deaktivieren.
mysql> create user 'otto' identified by 'geheim' attribute'{"Department": "IT", "Priority": "A"}'; Query OK, 0 rows affected (0.01 sec) mysql> create user 'lisa' identified by 'geheim' attribute'{"Department": "Controlling", "Priority": "A"}'; Query OK, 0 rows affected (0.01 sec) mysql> create user 'maria' identified by 'geheim' attribute'{"Department": "HR", "Priority": "B"}'; Query OK, 0 rows affected (0.01 sec) mysql> create user 'max' identified by 'geheim' attribute'{"Department": "IT", "Priority": "C"}'; Query OK, 0 rows affected (0.01 sec)
Natürlich können diese Daten auch gezielt ausgelesen werden:
mysql> select user, user_attributes->>'$.metadata.Department' from user where user = 'lisa'; +------+-------------------------------------------+ | user | user_attributes->>'$.metadata.Department' | +------+-------------------------------------------+ | lisa | Controlling | +------+-------------------------------------------+
Nehmen wir mal den Fall an, dass wir die User einer bestimmten Abteilung (IT) für einige Zeit sperren wollen. Die möglichen Kommandos dafür wären die folgenden:
mysql> update user set account_locked='Y' where user_attributes->>'$.metadata.Department' = 'IT'; Query OK, 2 rows affected (0.01 sec) Rows matched: 2 Changed: 2 Warnings: 0 mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) mysql> exit Bye bash-4.4# mysql -uotto -pgeheim ERROR 3118 (HY000): Access denied for user 'otto'@'localhost'. Account is locked.
Seit MySQL 8.0.22 gibt es zusätzlich im „information_schema“ eine Sicht „user_attributes“ mit den entsprechenden Informationen:
mysql> select * from information_schema.user_attributes where attribute->>'$.Department' = 'IT'; +------+------+---------------------------------------+ | USER | HOST | ATTRIBUTE | +------+------+---------------------------------------+ | max | % | {"Priority": "C", "Department": "IT"} | | otto | % | {"Priority": "A", "Department": "IT"} | +------+------+---------------------------------------+ 2 rows in set (0.00 sec)
Fazit
Die Spalte „user_attributes“ gibt es seit MySQL 8. Sie ist eine nützliche Erweiterung im Umfeld der Account-Verwaltung und bietet die Möglichkeit, Nutzer besser zu kategorisieren. Sicherlich gibt es da draußen viele Anwendungsfälle, wo diese JSON-Informationen nützlich sein können. Nutzen Sie bereits dieses Feature? Wenn ja, wofür? Schreiben Sie uns gerne, welches Problem Sie damit gelöst haben oder stellen Sie eine andere Frage, die wir hier diskutieren sollen.
Seminarempfehlung
MYSQL ADMINISTRATION DB-MY-01
Zum SeminarPrincipal Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare