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