本トピックでは、ロールと権限を管理するための構文について説明し、関連する例を示します。
PolarDB-X は、ネイティブ MySQL 8.0 のロールベースアクセス制御と互換性があります。詳細については、ロールベースアクセス制御に関する MySQL ドキュメントをご参照ください。
ロールの作成
構文:
CREATE ROLE role [, role]...
role は、user と同様に、名前とホストで構成されます。
- 名前を空にすることはできません。
- ホストは、次のルールに従う必要があります:
- ホストには、IP アドレスまたはホスト名を指定できます。パーセント記号 (%) とアンダースコア (_) はワイルドカードとして機能します。
- ホストが指定されていない場合、デフォルトは '%' になります。これは、任意のホストに一致するワイルドカードとして機能します。
例:
CREATE ROLE 'role_ro'@'%', 'role_write';
ロールの削除
構文:
DROP ROLE role [, role] ...
例:
DROP ROLE 'role_ro'@'%';
ロールの付与
ロールへの権限の付与構文:
GRANT priv_type [, priv_type] ... ON priv_level TO role [, role]... [WITH GRANT OPTION]
例:
GRANT ALL PRIVILEGES ON db1.* TO 'role_write';ユーザーへのロールの付与
構文:
GRANT role [, role] ...
TO user_or_role [, user_or_role] ...
[WITH ADMIN OPTION]
注意事項:
- このコマンドを実行するには、次のいずれかの条件を満たす必要があります:
- 現在のユーザーが `CREATE_USER` 権限を持っている。
- 現在のユーザーに `ADMIN OPTION` 付きでロールが付与されている。
- `WITH ADMIN OPTION` 句を含めると、ロールを付与されたユーザーは、そのロールを他のユーザーに付与できます。
- ユーザーにロールを付与しても、その権限は自動的に有効になりません。ロールを有効にするには、
SET DEFAULT ROLEまたはSET ROLEを使用する必要があります。
例:
GRANT 'role_write' TO 'user1'@'127.0.0.1';デフォルトロールの設定
構文:
SET DEFAULT ROLE
{NONE | ALL | role [, role ] ...}
TO user [, user ] ...
このコマンドを実行するには、次のいずれかの条件を満たす必要があります:
- 指定されたロールが、ターゲットユーザーにすでに付与されている。
- ご自身がターゲットユーザーであるか、`CREATE_USER` 権限を持っている。
例:
SET DEFAULT ROLE 'role_write' TO 'user1'@'127.0.0.1';セッションロールの設定
構文:
SET ROLE {
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
}
説明
SET ROLE DEFAULTステートメントを実行すると、SET DEFAULT ROLEステートメントで指定されたロールがアクティブなロールになります。- この構文で有効化されたロールは、現在のセッションでのみ有効です。
例:
SET ROLE 'role_write';
ロール権限の表示
構文:
SHOW GRANTS
[FOR user_or_role
[USING role [, role] ...]]
例:
SHOW GRANTS FOR 'role_write'@'%';
+---------------------------------------------------+
| GRANTS FOR 'ROLE_WRITE'@'%' |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO 'role_write'@'%' |
| GRANT ALL PRIVILEGES ON db1.* TO 'role_write'@'%' |
+---------------------------------------------------+
SHOW GRANTS FOR 'user1'@'127.0.0.1' USING 'role_write';
+------------------------------------------------------+
| GRANTS FOR 'USER1'@'127.0.0.1' |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'127.0.0.1' |
| GRANT ALL PRIVILEGES ON db1.* TO 'user1'@'127.0.0.1' |
| GRANT 'role_write'@'%' TO 'user1'@'127.0.0.1' |
+------------------------------------------------------+
-- Run in a session as user1
SELECT CURRENT_ROLE();
+------------------+
| CURRENT_ROLE() |
+------------------+
| 'role_write'@'%' |
+------------------+
ロールの取り消し
ロールからの権限の取り消し構文:
REVOKE priv_type [, priv_type] ... ON priv_level FROM role [, role]...
例:
REVOKE ALL PRIVILEGES ON db1.* FROM 'role_write';
SHOW GRANTS FOR 'role_write'@'%';
+----------------------------------------+
| GRANTS FOR 'ROLE_WRITE'@'%' |
+----------------------------------------+
| GRANT USAGE ON *.* TO 'role_write'@'%' |
+----------------------------------------+ユーザーからのロールの取り消し構文:
REVOKE role [, role ] ... FROM user_or_role [, user_or_role ] ...例:
SHOW GRANTS FOR 'user1'@'127.0.0.1';
+-----------------------------------------------+
| GRANTS FOR 'USER1'@'127.0.0.1' |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'127.0.0.1' |
| GRANT SELECT ON db1.* TO 'user1'@'127.0.0.1' |
| GRANT 'role_write'@'%' TO 'user1'@'127.0.0.1' |
+-----------------------------------------------+
REVOKE 'role_write' FROM 'user1'@'127.0.0.1';
SHOW GRANTS FOR 'user1'@'127.0.0.1';
+----------------------------------------------+
| GRANTS FOR 'USER1'@'127.0.0.1' |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'127.0.0.1' |
| GRANT SELECT ON db1.* TO 'user1'@'127.0.0.1' |
+----------------------------------------------+