MySQL 8.
ROLEの追加によって、
なお、
ROLEの説明
MySQLの公式ドキュメントによると、
ROLEの作成
ROLEは CREATE ROLE <role名>
で作成することができます。ROLEの削除をする場合はDROP ROLE <role名>
で削除することができます。
mysql> CREATE ROLE ro_role; Query OK, 0 rows affected (0.07 sec)
作ったROLEはmysql.
mysql> SELECT user,host FROM mysql.user WHERE user = 'ro_role'; +---------+------+ | user | host | +---------+------+ | ro_role | % | +---------+------+ 1 row in set (0.00 sec)
このROLEにはまだ権限がない状態なのでd1データベースに対してSELECT権限を与えてみます。付与されている権限の一覧は、
mysql> GRANT SELECT on d1.* to ro_role; Query OK, 0 rows affected (0.07 sec) mysql> SHOW GRANTS FOR 'ro_role'@'%'; +-----------------------------------------+ | Grants for ro_role@% | +-----------------------------------------+ | GRANT USAGE ON *.* TO `ro_role`@`%` | | GRANT SELECT ON `d1`.* TO `ro_role`@`%` | +-----------------------------------------+ 2 rows in set (0.04 sec)
実際にtest_
mysql> GRANT 'ro_role' to test_user@localhost; Query OK, 0 rows affected (0.05 sec) mysql> SHOW GRANTS FOR test_user@localhost; +------------------------------------------------+ | Grants for test_user@localhost | +------------------------------------------------+ | GRANT USAGE ON *.* TO `test_user`@`localhost` | | GRANT `ro_role`@`%` TO `test_user`@`localhost` | +------------------------------------------------+
test_
ここで注意していただきたいことは、
mysql> CREATE USER test_user2@'%'; Query OK, 0 rows affected (0.05 sec) mysql> DROP ROLE test_user2; Query OK, 0 rows affected (0.01 sec)
ROLEの動きの確認する
先ほど作った、
mysql> SELECT CURRENT_ROLE(); +----------------+ | CURRENT_ROLE() | +----------------+ | NONE | +----------------+ 1 row in set (0.03 sec)
上記のように、
mysql> SET ROLE ro_role; Query OK, 0 rows affected (0.04 sec) mysql> SELECT CURRENT_ROLE(); +----------------+ | CURRENT_ROLE() | +----------------+ | `ro_role`@`%` | +----------------+ 1 row in set (0.00 sec)
デフォルトでROLEを付与する
SET DEFAULT ROLE構文を利用することで、SET ROLE DEFAUL構文
を利用した時に有効となるROLEのことです。
d1データベースに書き込み権限を持ったrw_
mysql> GRANT 'rw_role' to test_user@localhost; Query OK, 0 rows affected (0.07 sec) mysql> SHOW GRANTS FOR test_user@localhost; +--------------------------------------------------------------+ | Grants for test_user@localhost | +--------------------------------------------------------------+ | GRANT USAGE ON *.* TO `test_user`@`localhost` | | GRANT `ro_role`@`%`,`rw_role`@`%` TO `test_user`@`localhost` | +--------------------------------------------------------------+ 2 rows in set (0.04 sec) mysql> SET DEFAULT ROLE ro_role TO test_user@localhost; Query OK, 0 rows affected (0.02 sec)
この状態でtest_
mysql> SELECT CURRENT_ROLE(); +----------------+ | CURRENT_ROLE() | +----------------+ | `ro_role`@`%` | +----------------+ 1 row in set (0.00 sec)
デフォルトでro_
mysql> SET ROLE ro_role,rw_role; Query OK, 0 rows affected (0.00 sec) mysql> SELECT CURRENT_ROLE(); +-----------------------------+ | CURRENT_ROLE() | +-----------------------------+ | `ro_role`@`%`,`rw_role`@`%` | +-----------------------------+ 1 row in set (0.00 sec)
DEFAULT ROLEを何も設定しない場合はSET DEFAULT ROLE NONE
、SET DEFAULT ROLE ALL
を利用して、
SET ROLE構文
SET ROLE構文は、
DEFAULTはSET DEFAULT ROLEで指定したものを有効にします。NONEは全てのROLEを無効にします。ALLは付与されているROLE全てを有効にします。ALL EXCEPT
まとめ
今回は、