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
被指派了角色 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
來分別判斷具有或不具有強制角色的權限。