mita2 database life

主にMySQLに関するメモです

MySQL 8.0でrootのSHOW GRANTSの表現が変わった

8.0からGRANT ALLしたユーザをSHOW GRANTS FORすると、ALL PRIVILEGESではなく、 実際に付与されている個別の権限が列挙されるようになってた。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'super'@'%';
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW GRANTS FOR 'super'@'%' \G
*************************** 1. row ***************************
Grants for super@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN,
PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW,
CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE,
DROP ROLE ON *.* TO `super`@`%`
*************************** 2. row ***************************
Grants for super@%: GRANT BACKUP_ADMIN,BINLOG_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,
GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,
RESOURCE_GROUP_USER,ROLE_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `super`@`%`
2 rows in set (0.00 sec)
5.7ではこうだった。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'super'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR 'super'@'%';
+--------------------------------------------+
| Grants for super@% |
+--------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'super'@'%' |
+--------------------------------------------+
1 row in set (0.00 sec)
5.7でも権限として「ALL」というものは存在しない。 全部の権限がGRANTされていると「ALL PRIVILEGES」と表現されてるだけ。
GRANT ALL したユーザから一部の権限をREVOKEしてやると、わかりやすい。

mysql> REVOKE INDEX ON *.* FROM 'super'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW GRANTS FOR 'super'@'%' \G
*************************** 1. row ***************************
Grants for super@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE,
DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, ALTER, SHOW DATABASES,
SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE,
REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE,
CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE ON *.* TO 'super'@'%'
1 row in set (0.00 sec)

mysql> GRANT INDEX ON *.* TO 'super'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR 'super'@'%'; +--------------------------------------------+
| Grants for super@% |
+--------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'super'@'%' |
+--------------------------------------------+
1 row in set (0.00 sec)
8.0のほうが自然な仕様に感じる。
特権DBアカウントかどうかを「ALL PRIVILEGES」で判断していると8.0にバージョンアップしたときにハマるかもしれない。