SHOW GRANTS
[FOR user_or_role
[USING role [, role] ...]]
user_or_role: {
user (see セクション6.2.4「アカウント名の指定」)
| role (see セクション6.2.5「ロール名の指定」.
}
このステートメントは、MySQL ユーザーアカウントまたはロールに割り当てられている権限およびロールを、権限およびロールの割当てを複製するために実行する必要がある GRANT
ステートメントの形式で表示します。
MySQL アカウントの非権限情報を表示するには、SHOW CREATE USER
ステートメントを使用します。 セクション13.7.7.12「SHOW CREATE USER ステートメント」を参照してください。
SHOW GRANTS
には、mysql
システムスキーマに対する SELECT
権限が必要ですが、現行ユーザーの権限およびロールは表示されません。
SHOW GRANTS
のアカウントまたはロールに名前を付けるには、GRANT
ステートメントと同じ形式 ('jeffrey'@'localhost'
など) を使用します:
mysql> SHOW GRANTS FOR 'jeffrey'@'localhost';
+------------------------------------------------------------------+
| Grants for jeffrey@localhost |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jeffrey`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `db1`.* TO `jeffrey`@`localhost` |
+------------------------------------------------------------------+
ホスト部分を省略すると、デフォルトで'%'
に設定されます。 アカウント名およびロール名の指定の詳細は、セクション6.2.4「アカウント名の指定」 および セクション6.2.5「ロール名の指定」 を参照してください。
現在のユーザー (サーバーへの接続に使用しているアカウント) に付与されている権限を表示するには、次のいずれかのステートメントを使用できます:
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
実行者権限ではなく定義者権限で実行されるストアドプロシージャ内など、定義者コンテキストで SHOW GRANTS FOR CURRENT_USER
(または同等の構文) が使用されている場合、表示される権限は実行者ではなく定義者の権限付与です。
以前のシリーズと比較した MySQL 8.0 では、SHOW GRANTS
のグローバル権限出力に ALL PRIVILEGES
が表示されなくなりました。これは、グローバルレベルの ALL PRIVILEGES
の意味が、定義されている動的権限によって異なるためです。 かわりに、SHOW GRANTS
では、付与されている各グローバル権限が明示的にリストされます:
mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| 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 `root`@`localhost` WITH GRANT |
| OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
SHOW GRANTS
出力を処理するアプリケーションは、それに応じて調整する必要があります。
グローバルレベルでは、GRANT OPTION
は付与されているすべての静的グローバル権限に適用されますが (いずれかに付与されている場合)、付与されている動的権限に個別に適用されます。 SHOW GRANTS
では、グローバル権限は次のように表示されます:
付与されているすべての静的権限 (存在する場合) をリストする行 (該当する場合は
WITH GRANT OPTION
を含む)。GRANT OPTION
が付与されているすべての付与された動的権限 (WITH GRANT OPTION
を含む) がリストされた行。GRANT OPTION
が付与されていない、付与されているすべての動的権限がWITH GRANT OPTION
なしでリストされた行。
オプションの USING
句を使用すると、SHOW GRANTS
でユーザーのロールに関連付けられている権限を調べることができます。 USING
句で指定された各ロールをユーザーに付与する必要があります。
次のように、ユーザー u1
に r1
および r2
のロールが割り当てられているとします:
CREATE ROLE 'r1', 'r2';
GRANT SELECT ON db1.* TO 'r1';
GRANT INSERT, UPDATE, DELETE ON db1.* TO 'r2';
CREATE USER 'u1'@'localhost' IDENTIFIED BY 'u1pass';
GRANT 'r1', 'r2' TO 'u1'@'localhost';
USING
を使用しない SHOW GRANTS
には、付与されたロールが表示されます:
mysql> SHOW GRANTS FOR 'u1'@'localhost';
+---------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
USING
句を追加すると、その句で指定された各ロールに関連付けられた権限もステートメントに表示されます:
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1';
+---------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT SELECT ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r2';
+-------------------------------------------------------------+
| Grants for u1@localhost |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+-------------------------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2';
+---------------------------------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------------------------------+
アカウントに付与された権限は常に有効ですが、ロールは有効ではありません。 アカウントのアクティブロールは、activate_all_roles_on_login
システム変数の値、アカウントのデフォルトロール、および SET ROLE
がセッション内で実行されたかどうかによって、セッション間で異なる場合があります。
MySQL 8.0.16 以上では、グローバル権限を特定のスキーマに適用できないように制限できるように、グローバル権限の部分的な取消しがサポートされています (セクション6.2.12「部分取消しを使用した権限の制限」 を参照)。 特定のスキーマに対して取り消されたグローバルスキーマ権限を示すために、SHOW GRANTS
出力には REVOKE
ステートメントが含まれています:
mysql> SET PERSIST partial_revokes = ON;
mysql> CREATE USER u1;
mysql> GRANT SELECT, INSERT, DELETE ON *.* TO u1;
mysql> REVOKE SELECT, INSERT ON mysql.* FROM u1;
mysql> REVOKE DELETE ON world.* FROM u1;
mysql> SHOW GRANTS FOR u1;
+--------------------------------------------------+
| Grants for u1@% |
+--------------------------------------------------+
| GRANT SELECT, INSERT, DELETE ON *.* TO `u1`@`%` |
| REVOKE SELECT, INSERT ON `mysql`.* FROM `u1`@`%` |
| REVOKE DELETE ON `world`.* FROM `u1`@`%` |
+--------------------------------------------------+
SHOW GRANTS
では、指定されたアカウントで使用できるが、別のアカウントに付与されている権限は表示されません。 たとえば、匿名アカウントが存在する場合、名前付きアカウントはその権限を使用できますが、SHOW GRANTS
では表示されません。
SHOW GRANTS
では、mandatory_roles
システム変数値で指定された必須ロールが次のように表示されます:
FOR
句を指定しないSHOW GRANTS
では、現行ユーザーの権限が表示され、必須ロールが含まれます。SHOW GRANTS FOR
には、指定したユーザーの権限が表示され、必須ロールは含まれません。user
この動作は、SHOW GRANTS FOR
の出力を使用して、指定されたユーザーに明示的に付与される権限を決定するアプリケーションの利点です。 その出力に必須ロールが含まれていたため、ユーザーに明示的に付与されたロールを必須ロールと区別することは困難です。
user
現行ユーザーの場合、アプリケーションでは、SHOW GRANTS
または SHOW GRANTS FOR CURRENT_USER
をそれぞれ使用して、必須ロールの有無にかかわらず権限を決定できます。