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”.
}
此语句显示分配给 MySQL 用户帐户或角色的权限和角色,以 GRANT
语句的形式,必须执行这些语句才能复制权限和角色分配。
要显示 MySQL 帐户的非权限信息,请使用 SHOW CREATE USER
语句。请参阅 第 15.7.7.13 节,“SHOW CREATE USER 语句”。
SHOW GRANTS
需要 SELECT
权限才能访问 mysql
系统模式,但显示当前用户的权限和角色除外。
要为 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';
SHOW GRANTS
不使用 USING
会显示授予的角色。
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
系统变量值中命名的强制角色。
SHOW GRANTS
不带FOR
子句会显示当前用户的权限,并包含强制角色。SHOW GRANTS FOR
会显示命名用户的权限,并且不包含强制角色。user
这种行为有利于使用 SHOW GRANTS FOR
输出确定哪些权限明确授予命名用户的应用程序。如果该输出包含强制角色,那么很难区分明确授予用户的角色和强制角色。user
对于当前用户,应用程序可以使用 SHOW GRANTS
或 SHOW GRANTS FOR CURRENT_USER
分别确定包含或不包含强制角色的权限。