文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  SHOW GRANTS 陳述式

15.7.7.22 SHOW GRANTS 陳述式

SHOW GRANTS
    [FOR user_or_role
        [USING role [, role] ...]]

user_or_role: {
    user (see Section 8.2.4, “Specifying Account Names”)
  | role (see Section 8.2.5, “Specifying Role Names”.
}

此陳述式會以 GRANT 陳述式的形式,顯示指派給 MySQL 使用者帳戶或角色的權限和角色,這些陳述式必須執行才能複製權限和角色指派。

注意

若要顯示 MySQL 帳戶的非權限資訊,請使用 SHOW CREATE USER 陳述式。請參閱 第 15.7.7.13 節,「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` |
+------------------------------------------------------------------+

如果省略主機部分,則預設為 '%'。如需有關指定帳戶和角色名稱的其他資訊,請參閱 第 8.2.4 節,「指定帳戶名稱」,以及 第 8.2.5 節,「指定角色名稱」

若要顯示授與目前使用者 (您用來連線到伺服器的帳戶) 的權限,您可以使用下列任何陳述式

SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();

如果在定義者環境中使用 SHOW GRANTS FOR CURRENT_USER (或任何等效語法),例如在以定義者權限而非調用者權限執行的預存程序中,則顯示的授與是定義者的授與,而非調用者的授與。

在 MySQL 8.4 中,與先前的系列相比,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 被指派了角色 r1r2,如下所示

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';

沒有 USINGSHOW 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.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 GRANTSSHOW GRANTS FOR CURRENT_USER 來判斷具有或沒有必要角色的權限。