MySQL 8.0 リファレンスマニュアル


13.7.7.21 SHOW GRANTS ステートメント

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 句で指定された各ロールをユーザーに付与する必要があります。

次のように、ユーザー u1r1 および 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 をそれぞれ使用して、必須ロールの有無にかかわらず権限を決定できます。


関連キーワード:  ステートメント, CREATE, GRANTS, 権限, GRANT, TABLE, ロール, DROP, 付与, FOR