Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.7.7.22 显示授权语句

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语句,需要执行这些语句以复制权限和角色分配。

Note

要显示 MySQL 账户的非权限信息,使用SHOW CREATE USER语句。请参阅第15.7.7.13节,“SHOW CREATE USER 语句”

SHOW GRANTS需要SELECT权限,except for displaying privileges and roles for the current user.

要为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(或等效语法)在定义器上下文中,例如在存储过程中执行时使用定义器权限,而不是invoker权限,显示的授予的是定义器的授予,而不是invoker的授予。

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

授予给账户的权限总是生效的,但角色不是。账户的活动角色可以在会话之间和会话内部不同,取决于activate_all_roles_on_login系统变量、账户默认角色和是否在会话中执行SET ROLE语句。

MySQL支持部分撤销全局权限,使得全局权限可以被限制到特定的模式中(见Section 8.2.12, “Privilege Restriction Using Partial Revokes”)。为了指示哪些全局权限已经被撤销到特定的模式中,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 GRANTSSHOW GRANTS FOR CURRENT_USER,分别确定权限是否包括强制角色。