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


MySQL 9.0 參考手冊  /  ...  /  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 9.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 被指派了角色 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 來分別判斷具有或不具有強制角色的權限。