#### 13.7.7.21 显示授予声明

[](<>)[](<>)[](<>)

```
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”.
}
```

此语句显示分配给 MySQL 用户帐户或角色的权限和角色，形式为[`授予`](grant.html)必须执行以复制权限和角色分配的语句。

笔记

要显示 MySQL 帐户的非特权信息，请使用[`显示创建用户`](show-create-user.html)陈述。看[第 13.7.7.12 节，“显示创建用户语句”](show-create-user.html).

[`显示赠款`](show-grants.html)需要[`选择`](privileges-provided.html#priv_select)的特权`mysql`系统模式，除了显示当前用户的权限和角色。

命名帐户或角色[`显示赠款`](show-grants.html), 使用与[`授予`](grant.html)声明（例如，`'杰弗里'@'本地主机'`):

```
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 节，“指定帐户名称”](account-names.html)， 和[第 6.2.5 节，“指定角色名称”](role-names.html).

要显示授予当前用户（您用于连接服务器的帐户）的权限，您可以使用以下任何语句：

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

[](<>)[](<>)[](<>)[](<>)

如果`显示 CURRENT_USER 的授权`（或任何等效语法）在定义者上下文中使用，例如在使用定义者而不是调用者权限执行的存储过程中，显示​​的授权是定义者而不是调用者的授权。

在 MySQL 8.0 中与之前的系列相比，[`显示赠款`](show-grants.html)不再显示[`所有特权`](privileges-provided.html#priv_all)在其全局权限输出中，因为[`所有特权`](privileges-provided.html#priv_all)全局级别根据定义的动态权限而有所不同。反而，[`显示赠款`](show-grants.html)明确列出每个授予的全局权限：

```
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.html)应相应调整输出。

在全球层面，[`授予选项`](privileges-provided.html#priv_grant-option)如果授予其中任何一个，则适用于所有授予的静态全局权限，但单独应用于授予的动态权限。[`显示赠款`](show-grants.html)以这种方式显示全局权限：

-   一行列出所有授予的静态权限（如果有），包括`有授予选项`如果合适的话。

-   一行列出了所有授予的动态权限[`授予选项`](privileges-provided.html#priv_grant-option)被授予，如果有的话，包括`有授予选项`.

-   一行列出了所有授予的动态权限[`授予选项`](privileges-provided.html#priv_grant-option)不被授予，如果有的话，没有`有授予选项`.

    与可选`使用`条款，[`显示赠款`](show-grants.html)使您能够检查与用户角色相关联的权限。中命名的每个角色`使用`子句必须授予用户。

    假设该用户`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.html)没有`使用`显示授予的角色：

```
mysql> SHOW GRANTS FOR 'u1'@'localhost';
+---------------------------------------------+
| Grants for u1@localhost                     |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost`      |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
```

添加一个`使用`子句使语句还显示与子句中命名的每个角色相关联的特权：

```
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`](server-system-variables.html#sysvar_activate_all_roles_on_login)系统变量、帐户默认角色以及是否[`设定角色`](set-role.html)已在会话中执行。

MySQL 8.0.16 及更高版本支持部分撤销全局权限，因此可以限制全局权限应用于特定模式（请参阅[第 6.2.12 节，“使用部分撤销的权限限制”](partial-revokes.html)）。指示哪些全局模式特权已针对特定模式撤销，`显示赠款`输出包括`撤销`声明：

```
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.html)不显示指定帐户可用但授予不同帐户的权限。例如，如果存在匿名帐户，则命名帐户可能能够使用其权限，但[`显示赠款`](show-grants.html)不显示它们。

[`显示赠款`](show-grants.html)显示在[`强制角色`](server-system-variables.html#sysvar_mandatory_roles)系统变量值如下：

-   [`显示赠款`](show-grants.html)没有`为了`子句显示当前用户的权限，并包括强制角色。

-   [`显示赠款 *`用户`*`](show-grants.html)显示指定用户的权限，并且不包括强制角色。

    此行为有利于使用[`显示赠款 *`用户`*`](show-grants.html)以确定哪些权限被明确授予指定用户。如果该输出包含强制角色，则很难将明确授予用户的角色与强制角色区分开来。

    对于当前用户，应用程序可以通过使用来确定具有或不具有强制角色的权限[`显示赠款`](show-grants.html)要么[`显示 CURRENT_USER 的授权`](show-grants.html)， 分别。
