文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  SHOW GRANTS 语句

15.7.7.22 SHOW GRANTS 语句

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 需要 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 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 被分配了角色 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.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 GRANTSmandatory_roles 系统变量值中命名的强制角色显示如下。

  • SHOW GRANTS 不带 FOR 子句将显示当前用户的权限,并包括强制角色。

  • SHOW GRANTS FOR user 将显示命名用户的权限,不包括强制角色。

这种行为是为了方便使用 SHOW GRANTS FOR user 的输出确定哪些权限明确授予命名用户的应用程序。如果该输出包含强制角色,则很难区分明确授予用户的角色和强制角色。

对于当前用户,应用程序可以使用 SHOW GRANTSSHOW GRANTS FOR CURRENT_USER 分别确定包含或不包含强制角色的权限。