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 分别确定包含或不包含强制角色的权限。