Documentation Home

13.7.7.21 SHOW GRANTS 语句

SHOW GRANTS
    [FOR user_or_role
        [USING role [, role] ...]]

user_or_role: {
    user (see Section 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”.
}

GRANT此语句以必须执行以复制权限和角色分配 的语句的形式显示分配给 MySQL 用户帐户或角色 的权限和角色。

笔记

要显示 MySQL 帐户的非特权信息,请使用该SHOW CREATE USER语句。请参阅第 13.7.7.12 节,“显示创建用户语句”

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` |
+------------------------------------------------------------------+

主机部分,如果省略,默认为'%'. 有关指定帐户和角色名称的其他信息,请参阅第 6.2.4 节,“指定帐户名称”第 6.2.5 节,“指定角色名称”

要显示授予当前用户(您用于连接服务器的帐户)的权限,您可以使用以下任何语句:

SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();

如果SHOW GRANTS FOR CURRENT_USER(或任何等效语法)在定义者上下文中使用,例如在使用定义者而不是调用者特权执行的存储过程中,则显示的授权是定义者而非调用者的授权。

在 MySQL 8.0 中,与之前的系列相比, SHOW GRANTS不再显示 ALL PRIVILEGES在其 global-privileges 输出中,因为 at the global level 的含义 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分配了角色 r1r2,如下:

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.0.16 及更高版本支持全局权限的部分撤销,这样可以限制全局权限应用于特定模式(请参阅 第 6.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