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 被指派了角色 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.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 來判斷具有或沒有必要角色的權限。