### 6.2.3 授权表

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

这`mysql`系统数据库包括几个授权表，其中包含有关用户帐户及其所拥有权限的信息。本节介绍这些表。有关系统数据库中其他表的信息，请参见[第 5.3 节，“mysql 系统架构”](system-schema.html).

这里的讨论描述了授权表的底层结构以及服务器在与客户端交互时如何使用它们的内容。但是，通常您不会直接修改授权表。当您使用帐户管理语句时，会间接发生修改，例如[`创建用户`](create-user.html),[`授予`](grant.html)， 和[`撤销`](revoke.html)设置帐户并控制每个人可用的权限。看[第 13.7.1 节，“账户管理声明”](account-management-statements.html).当您使用此类语句执行帐户操作时，服务器会代表您修改授权表。

笔记

使用语句直接修改授权表，例如[`插入`](insert.html),[`更新`](update.html)， 要么[`删除`](delete.html)不鼓励这样做，风险自负。服务器可以自由地忽略由于此类修改而导致格式错误的行。

对于修改授权表的任何操作，服务器都会检查该表是否具有预期的结构，如果没有则产生错误。要将表更新为预期的结构，请执行 MySQL 升级过程。看[第 2.11 节，“升级 MySQL”](upgrading.html).

-   [授权表概述](grant-tables.html#grant-tables-overview)

-   [用户和数据库授权表](grant-tables.html#grant-tables-user-db)

-   [桌子\_priv 和列\_priv 授予表](grant-tables.html#grant-tables-tables-priv-columns-priv)

-   [过程\_私人授权表](grant-tables.html#grant-tables-procs-priv)

-   [代理人\_私人授权表](grant-tables.html#grant-tables-proxies-priv)

-   [全球\_补助金表](grant-tables.html#grant-tables-global-grants)

-   [默认\_角色授权表](grant-tables.html#grant-tables-default-roles)

-   [角色\_边缘授予表](grant-tables.html#grant-tables-role-edges)

-   [密码\_历史授权表](grant-tables.html#grant-tables-password-history)

-   [授予表范围列属性](grant-tables.html#grant-tables-scope-column-properties)

-   [授予表特权列属性](grant-tables.html#grant-tables-privilege-column-properties)

-   [授予表并发](grant-tables.html#grant-tables-concurrency)

#### 授权表概述

这些`mysql`数据库表包含授权信息：

-   [`用户`](grant-tables.html#grant-tables-user-db)：用户帐户、静态全局权限和其他非权限列。

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

-   [`global_grants`](grant-tables.html#grant-tables-global-grants)：动态全局权限。

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

-   [`D b`](grant-tables.html#grant-tables-user-db): 数据库级权限。

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

-   [`table_priv`](grant-tables.html#grant-tables-tables-priv-columns-priv)：表级权限。

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

-   [`columns_priv`](grant-tables.html#grant-tables-tables-priv-columns-priv)：列级权限。

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

-   [`procs_priv`](grant-tables.html#grant-tables-procs-priv): 存储过程和函数权限。

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

-   [`proxies_priv`](grant-tables.html#grant-tables-proxies-priv): 代理用户权限。

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

-   [`默认角色`](grant-tables.html#grant-tables-default-roles)：默认用户角色。

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

-   [`角色边缘`](grant-tables.html#grant-tables-role-edges): 角色子图的边。

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

-   [`密码历史`](grant-tables.html#grant-tables-password-history)：密码更改历史。

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

    有关静态和动态全局权限之间差异的信息，请参阅[静态与动态特权](privileges-provided.html#static-dynamic-privileges).)

    在 MySQL 8.0 中，授权表使用`InnoDB`存储引擎并且是事务性的。在 MySQL 8.0 之前，授权表使用`MyISAM`存储引擎并且是非事务性的。授权表存储引擎的这种变化使帐户管理语句的行为随之发生变化，例如[`创建用户`](create-user.html)要么[`授予`](grant.html).以前，命名多个用户的帐户管理语句可能对某些用户成功而对其他用户失败。现在，每条语句都是事务性的，要么对所有命名用户都成功，要么回滚，如果发生任何错误，则无效。

    每个授权表都包含范围列和特权列：

-   范围列确定表中每一行的范围；也就是说，该行适用的上下文。例如，一个`用户`表行与`主持人`和`用户`的值`'h1.example.net'`和`“鲍勃”`适用于验证从主机到服务器的连接`h1.example.net`由指定用户名的客户端`鲍勃`.同样，一个`D b`表行与`主持人`,`用户`， 和`D b`的列值`'h1.example.net'`,`“鲍勃”`和`“报告”`适用于`鲍勃`从主机连接`h1.example.net`访问`报告`数据库。这`table_priv`和`columns_priv`表格包含范围列，指示每行适用的表格或表格/列组合。这`procs_priv`范围列指示每行适用的存储例程。

-   权限列指示表行授予哪些权限；也就是说，它允许执行哪些操作。服务器将各种授权表中的信息结合起来，形成对用户权限的完整描述。[第 6.2.7 节，“访问控制，第 2 阶段：请求验证”](request-access.html), 描述了这个规则。

    此外，授权表可能包含用于范围或特权评估以外的目的的列。

    服务器以下列方式使用授权表：

-   这`用户`表范围列确定是拒绝还是允许传入连接。对于允许的连接，在`用户`表表示用户的静态全局权限。此表中授予的任何特权适用于*全部*服务器上的数据库。

    警告

    因为任何静态全局权限都被认为是所有数据库的权限，所以任何静态全局权限都允许用户查看所有数据库名称[`显示数据库`](show-databases.html)或通过检查[`图式`](information-schema-schemata-table.html)表`INFORMATION_SCHEMA`，但在数据库级别受到部分撤销限制的数据库除外。

-   这`global_grants`表列出了当前分配给用户帐户的动态全局权限。对于每一行，范围列确定哪个用户具有特权列中指定的特权。

-   这`D b`表范围列确定哪些用户可以从哪些主机访问哪些数据库。权限列确定允许的操作。在数据库级别授予的权限适用于数据库以及数据库中的所有对象，例如表和存储程序。

-   这`table_priv`和`columns_priv`表类似于`D b`表，但更细粒度：它们适用于表和列级别，而不是数据库级别。在表级别授予的特权适用于表及其所有列。在列级别授予的特权仅适用于特定列。

-   这`procs_priv`表适用于存储例程（存储过程和函数）。在例程级别授予的特权仅适用于单个过程或函数。

-   这`proxies_priv`表指示哪些用户可以充当其他用户的代理以及用户是否可以授予[`代理`](privileges-provided.html#priv_proxy)其他用户的特权。

-   这`默认角色`和`角色边缘`表包含有关角色关系的信息。

-   这`密码历史`表保留以前选择的密码以限制密码重用。看[第 6.2.15 节，“密码管理”](password-management.html).

    服务器在启动时将授权表的内容读入内存。您可以通过发出一个命令告诉它重新加载表[`刷新特权`](flush.html#flush-privileges)声明或执行[**mysqladmin 刷新权限**](mysqladmin.html)要么[**mysqladmin 重新加载**](mysqladmin.html)命令。授权表的更改生效，如[第 6.2.13 节，“权限更改生效时”](privilege-changes.html).

    当您修改帐户时，最好验证您的更改是否具有预期效果。要检查给定帐户的权限，请使用[`显示赠款`](show-grants.html)陈述。例如，要确定授予具有用户名和主机名值的帐户的权限`鲍勃`和`pc84.example.com`, 使用这个语句：


```
SHOW GRANTS FOR 'bob'@'pc84.example.com';
```

要显示帐户的非特权属性，请使用[`显示创建用户`](show-create-user.html)：

```
SHOW CREATE USER 'bob'@'pc84.example.com';
```

#### 用户和数据库授权表

服务器使用`用户`和`D b`中的表`mysql`数据库在访问控制的第一和第二阶段（见[第 6.2 节，“访问控制和帐户管理”](access-control.html)）。中的列`用户`和`D b`表显示在这里。

[](<>)

**表 6.4 用户和数据库表列**

| 表名 | `用户` | `D b` |
| --- | ---- | ----- |
| **范围列** | `主持人` | `主持人` |
|  | `用户` | `D b` |
|  |  | `用户` |
| **特权列** | `Select_priv` | `Select_priv` |
|  | `插入隐私` | `插入隐私` |
|  | `更新隐私` | `更新隐私` |
|  | `删除_priv` | `删除_priv` |
|  | `Index_priv` | `Index_priv` |
|  | `Alter_priv` | `Alter_priv` |
|  | `创建_priv` | `创建_priv` |
|  | `Drop_priv` | `Drop_priv` |
|  | `Grant_priv` | `Grant_priv` |
|  | `Create_view_priv` | `Create_view_priv` |
|  | `Show_view_priv` | `Show_view_priv` |
|  | `Create_routine_priv` | `Create_routine_priv` |
|  | `Alter_routine_priv` | `Alter_routine_priv` |
|  | `Execute_priv` | `Execute_priv` |
|  | `Trigger_priv` | `Trigger_priv` |
|  | `Event_priv` | `Event_priv` |
|  | `创建_tmp_table_priv` | `创建_tmp_table_priv` |
|  | `Lock_tables_priv` | `Lock_tables_priv` |
|  | `References_priv` | `References_priv` |
|  | `重载隐私` |  |
|  | `Shutdown_priv` |  |
|  | `Process_priv` |  |
|  | `File_priv` |  |
|  | `Show_db_priv` |  |
|  | `超级隐私` |  |
|  | `Repl_slave_priv` |  |
|  | `Repl_client_priv` |  |
|  | `创建用户隐私` |  |
|  | `Create_tablespace_priv` |  |
|  | `Create_role_priv` |  |
|  | `Drop_role_priv` |  |
| **安全栏** | `ssl_type` |  |
|  | `ssl_cipher` |  |
|  | `x509_issuer` |  |
|  | `x509_subject` |  |
|  | `插入` |  |
|  | `身份验证字符串` |  |
|  | `密码过期` |  |
|  | `password_last_changed` |  |
|  | `密码_生命周期` |  |
|  | `帐户被锁定` |  |
|  | `Password_reuse_history` |  |
|  | `密码重用时间` |  |
|  | `Password_require_current` |  |
|  | `用户属性` |  |
| **资源控制列** | `最大问题` |  |
|  | `最大更新` |  |
|  | `最大连接数` |  |
|  | `max_user_connections` |  |

这`用户`桌子`插入`和`身份验证字符串`列存储身份验证插件和凭据信息。

服务器使用在`插入`帐户行的列以验证帐户的连接尝试。

这`插入`列必须为非空。在启动时和运行时[`刷新特权`](flush.html#flush-privileges)执行时，服务器检查`用户`表行。对于任何有空的行`插入`列，服务器将警告写入此表单的错误日志：

```
[Warning] User entry 'user_name'@'host_name' has an empty plugin
value. The user will be ignored and no one can login with this user
anymore.
```

要将插件分配给缺少插件的帐户，请使用[`更改用户`](alter-user.html)陈述。

这`密码过期`列允许 DBA 使帐户密码过期并要求用户重置密码。默认`密码过期`值为`'N'`, 但可以设置为`'是'`与[`更改用户`](alter-user.html)陈述。帐户密码过期后，该帐户在后续连接服务器时执行的所有操作都会导致错误，直到用户发出[`更改用户`](alter-user.html)声明建立一个新的帐户密码。

笔记

虽然可以通过将过期密码设置为当前值来“重置”过期密码，但作为一个好的策略，最好选择不同的密码。DBA 可以通过建立适当的密码重用策略来强制不重用。看[密码重用政策](password-management.html#password-reuse-policy).

`password_last_changed`是一个`时间戳`指示密码上次更改时间的列。该值是非`空值`仅适用于使用 MySQL 内置身份验证插件的帐户（`mysql_native_password`,`sha256_password`， 要么`cache_sha2_password`）。值为`空值`对于其他帐户，例如使用外部身份验证系统进行身份验证的帐户。

`password_last_changed`由更新[`创建用户`](create-user.html),[`更改用户`](alter-user.html)， 和[`设置密码`](set-password.html)陈述，并通过[`授予`](grant.html)创建帐户或更改帐户密码的语句。

`密码_生命周期`表示账户密码的生命周期，以天为单位。如果密码已过期（使用`password_last_changed`列），当客户端使用该帐户连接时，服务器认为密码已过期。一个值*`ñ`*大于零意味着密码必须在每个*`ñ`*天。值 0 禁用自动密码过期。如果值为`空值`（默认），应用全局过期策略，由[`default_password_lifetime`](server-system-variables.html#sysvar_default_password_lifetime)系统变量。

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

`帐户被锁定`指示帐户是否被锁定（请参阅[第 6.2.20 节，“帐户锁定”](account-locking.html)）。

`Password_reuse_history`是的价值`密码历史`帐户选项，或`空值`对于默认历史。

`密码重用时间`是的价值`密码重用间隔`帐户选项，或`空值`为默认间隔。

`Password_require_current`（在 MySQL 8.0.13 中添加）对应的值`密码要求`账户的选项，如下表所示。

[](<>)

**表 6.5 允许的密码\_要求\_当前值**

| 密码\_要求\_当前值 | 对应的 PASSWORD REQUIRE 选项 |
| ----------- | ----------------------- |
| `'是'` | `密码需要当前` |
| `'N'` | `密码需要当前可选` |
| `空值` | `密码需要当前默认值` |

`用户属性`（在 MySQL 8.0.14 中添加）是一个 JSON 格式的列，用于存储未存储在其他列中的帐户属性。从 MySQL 8.0.21 开始，`INFORMATION_SCHEMA`通过暴露这些属性[`USER_ATTRIBUTES`](information-schema-user-attributes-table.html)桌子。

这`用户属性`列可能包含以下属性：

-   `附加密码`: 二级密码，如果有的话。看[双密码支持](password-management.html#dual-passwords).

-   `限制`：限制列表（如有）。通过部分撤销操作添加限制。属性值是一个元素数组，每个元素都有`数据库`和`限制`指示受限数据库的名称及其适用限制的键（请参阅[第6.2.12节，“使用部分撤销的特权限制”](partial-revokes.html)).

-   `密码锁定`：登录跟踪失败和临时帐户锁定（如果有）的条件（请参阅[登录跟踪和临时帐户锁定失败](password-management.html#failed-login-tracking)).这个`密码锁定`属性将根据`登录尝试失败`和`密码锁定时间`政府的选择[`创建用户`](create-user.html)和[`改变用户`](alter-user.html)声明。属性值是带有`登录尝试失败`和`密码锁定时间天数`指示为帐户指定的选项值的键。如果缺少键，则其值隐式为0。如果键值隐式或显式为0，则相应的功能将被禁用。这个属性是在MySQL 8.0.19中添加的。

-   `多因素认证`：表格中的行`mysql。使用者`系统表有一个`插件`指示身份验证插件的列。对于单因素身份验证，该插件是唯一的身份验证因素。对于两因素或三因素形式的多因素身份验证，该插件对应于第一个身份验证因素，但必须存储第二个和第三个因素的附加信息。这个`多因素认证`属性保存此信息。这个属性是在MySQL 8.0.27中添加的。

    这个`多因素认证`值是一个数组，其中每个数组元素都是一个哈希，使用以下属性描述身份验证因子：

    -   `插件`：身份验证插件的名称。

    -   `身份验证\u字符串`：验证字符串值。

    -   `无密码`：一个标志，表示是否要在没有密码的情况下使用用户（安全令牌是唯一的身份验证方法）。

    -   `需要注册`：定义用户帐户是否已注册安全令牌的标志。

        第一个和第二个数组元素描述了多因素认证因子2和3。

    如果没有适用的属性，`用户属性`是`无效的`.

    示例：具有辅助密码和部分被撤销的数据库权限的帐户`附加密码`和`限制`列值中的属性：


```
mysql> SELECT User_attributes FROM mysql.User WHERE User = 'u'\G
*************************** 1. row ***************************
User_attributes: {"Restrictions":
                   [{"Database": "mysql", "Privileges": ["SELECT"]}],
                  "additional_password": "hashed_credentials"}
```

要确定存在哪些属性，请使用[`JSON_KEYS（）`](json-search-functions.html#function_json-keys)功能：

```
SELECT User, Host, JSON_KEYS(User_attributes)
FROM mysql.user WHERE User_attributes IS NOT NULL;
```

提取特定属性，例如`限制`，这样做：

```
SELECT User, Host, User_attributes->>'$.Restrictions'
FROM mysql.user WHERE User_attributes->>'$.Restrictions' <> '';
```

下面是一个存储的信息类型的示例`多因素认证`:

```
{
  "multi_factor_authentication": [
    {
      "plugin": "authentication_ldap_simple",
      "passwordless": 0,
      "authentication_string": "ldap auth string",
      "requires_registration": 0
    },
    {
      "plugin": "authentication_fido",
      "passwordless": 0,
      "authentication_string": "",
      "requires_registration": 1
    }
  ]
}
```

#### 桌子\_priv和columns_priv Grant表

在访问控制的第二阶段，服务器执行请求验证，以确保每个客户端对其发出的每个请求都有足够的权限。除了`使用者`和`分贝`授权表，服务器也可以咨询`表_priv`和`列队`表用于包含表的请求。后面的表在表和列级别提供了更好的权限控制。它们的列如下表所示。

[](<>)

**表6.6表\_priv和columns_priv表列**

| 表名 | `表_priv` | `列队` |
| --- | -------- | ---- |
| **范围列** | `主办` | `主办` |
|  | `分贝` | `分贝` |
|  | `使用者` | `使用者` |
|  | `表2\u名称` | `表2\u名称` |
|  |  | `列名` |
| **特权栏** | `表_priv` | `列队` |
|  | `列队` |  |
| **其他专栏** | `时间戳` | `时间戳` |
|  | `授予人` |  |

这个`时间戳`和`授予人`列被设置为当前时间戳和[`当前用户`](information-functions.html#function_current-user)值，但在其他方面未使用。

#### 程序\_priv Grant表

对于涉及存储例程的请求的验证，服务器可以咨询`私人程序`表，其列如下表所示。

[](<>)

**表6.7程序\_priv表列**

| 表名 | `私人程序` |
| --- | ------ |
| **范围列** | `主办` |
|  | `分贝` |
|  | `使用者` |
|  | `程序名称` |
|  | `常规型` |
| **特权栏** | `私人检察官` |
| **其他专栏** | `时间戳` |
|  | `授予人` |

这个`常规型`列是一个[`枚举`](enum.html)值为的列`“功能”`或`“程序”`指示该行所指的例程类型。通过此列，可以分别为具有相同名称的函数和过程授予权限。

这个`时间戳`和`授予人`列未使用。

#### 代理人\_priv Grant表

这个`私人代理人`表记录有关代理帐户的信息。它有以下几列：

-   `主办`, `使用者`：代理账户；也就是说，拥有[`代理`](privileges-provided.html#priv_proxy)代理帐户的权限。

-   `代理_主机`, `代理用户`：代理帐户。

-   `授予人`, `时间戳`：未使用。

-   `格兰特`：代理帐户是否可以授予[`代理`](privileges-provided.html#priv_proxy)其他帐户的特权。

    对于一个能够授予[`代理`](privileges-provided.html#priv_proxy)对于其他帐户，它必须在`私人代理人`餐桌`格兰特`设置为1和`代理_主机`和`代理用户`设置为指示可以授予特权的一个或多个帐户。例如`“根”@“本地主机”`MySQL安装期间创建的帐户在`私人代理人`表，该表允许授予[`代理`](privileges-provided.html#priv_proxy)特权`''@''`，即适用于所有用户和所有主机。这使得`根`设置代理用户，以及将设置代理用户的权限委托给其他帐户。看见[第6.2.19节“代理用户”](proxy-users.html).

#### 全球\_拨款表

这个`全球大学助学金`表列出了用户帐户的动态全局权限的当前分配。该表包含以下列：

-   `使用者`, `主办`：被授予特权的帐户的用户名和主机名。

-   `PRIV`：特权名称。

-   `有_GRANT _选项`：该帐户是否可以将权限授予其他帐户。

#### 默认值\_角色授权表

这个`默认角色`表列出了默认用户角色。它有以下几列：

-   `主办`, `使用者`：应用默认角色的帐户或角色。

-   `默认角色主机`, `默认角色用户`：默认角色。

#### 角色\_边缘补助表

这个`角色!`表列出了角色子图的边。它有以下几列：

-   `从主机`, `来自用户`：被授予角色的帐户。

-   `主持人`, `给用户`：授予该帐户的角色。

-   `使用_ADMIN_选项`：该帐户是否可以通过使用将角色授予其他帐户并从中撤销角色`带管理员选项`.

#### 密码\_历史拨款表

这个`密码历史`表包含有关密码更改的信息。它有以下几列：

-   `主办`, `使用者`：发生密码更改的帐户。

-   `密码时间戳`：发生密码更改的时间。

-   `暗语`：新密码哈希值。

    这个`密码历史`表为每个帐户累积足够数量的非空密码，以使MySQL能够根据帐户密码历史长度和重用间隔执行检查。当密码更改尝试发生时，会自动删除超出这两个限制的条目。

笔记

空密码不计入密码历史记录，可随时重新使用。

如果帐户被重命名，其条目将被重命名以匹配。如果帐户被删除或其身份验证插件被更改，其条目将被删除。

#### 授予表作用域列属性

grant表中的作用域列包含字符串。每个的默认值都是空字符串。下表显示了每列中允许的字符数。

[](<>)

**表6.8授权表范围列长度**

| 列名 | 允许的最大字符数 |
| --- | -------- |
| `主办`, `代理_主机` | 255（MySQL 8.0.17之前的60） |
| `使用者`, `代理用户` | 32 |
| `分贝` | 64 |
| `表2\u名称` | 64 |
| `列名` | 64 |
| `程序名称` | 64 |

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

`主办`和`代理_主机`值在存储在grant表中之前会转换为小写。

为了进行访问检查，比较`使用者`, `代理用户`, `身份验证\u字符串`, `分贝`和`表2\u名称`值区分大小写。比较`主办`, `代理_主机`, `列名`和`程序名称`值不区分大小写。

#### 授予表特权列属性

这个`使用者`和`分贝`表在一个单独的列中列出每个特权，该列声明为`枚举（'N'，'Y'）默认值'N'`。换句话说，每个权限都可以被禁用或启用，默认设置为禁用。

这个`表_priv`, `列队`和`私人程序`表将特权列声明为[`设置`](set.html)柱。这些列中的值可以包含由表控制的权限的任意组合。仅启用列值中列出的特权。

[](<>)

**表6.9设置类型特权列值**

| 表名 | 列名 | 可能的集合元素 |
| --- | --- | ------- |
| `表_priv` | `表_priv` | `“选择”、“插入”、“更新”、“删除”、“创建”、“删除”、“授予”、“引用”、“索引”、“更改”、“创建视图”、“显示视图”、“触发器”` |
| `表_priv` | `列队` | `“选择”、“插入”、“更新”、“引用”` |
| `列队` | `列队` | `“选择”、“插入”、“更新”、“引用”` |
| `私人程序` | `私人检察官` | `“执行”、“更改例程”、“授予”` |

只有`使用者`和`全球大学助学金`表指定管理权限，例如[`重新加载`](privileges-provided.html#priv_reload), [`关闭`](privileges-provided.html#priv_shutdown)和[`系统变量管理`](privileges-provided.html#priv_system-variables-admin).管理操作是服务器本身上的操作，不是特定于数据库的，因此没有理由在其他授权表中列出这些权限。因此，服务器只需要咨询`使用者`和`全球大学助学金`用于确定用户是否可以执行管理操作的表。

这个[`文件`](privileges-provided.html#priv_file)特权也仅在`使用者`桌子这本身不是一种管理权限，但用户在服务器主机上读写文件的能力与所访问的数据库无关。

#### 授权表并发

从MySQL 8.0.22开始，为了允许在MySQL授权表上同时执行DML和DDL操作，以前在MySQL授权表上获取行锁的读取操作将作为非锁定读取执行。在MySQL授权表上作为非锁定读取执行的操作包括：

-   [`选择`](select.html)语句和其他只读语句，通过联接列表和子查询从授权表中读取数据，包括[`选择分享`](innodb-locking-reads.html)语句，使用任何事务隔离级别。

-   DML操作，使用任何事务隔离级别从授权表（通过联接列表或子查询）读取数据，但不修改它们。

    从授权表读取数据时不再获取行锁的语句，如果在使用基于语句的复制时执行，则会报告警告。

    使用时-[`binlog_格式=混合`](replication-options-binary-log.html#sysvar_binlog_format)，从grant表中读取数据的DML操作将作为行事件写入二进制日志，以确保混合模式复制的操作安全。

[`选择分享`](innodb-locking-reads.html)从grant表读取数据的语句会报告警告。和`分享`子句，grant表上不支持读锁。

从授权表读取数据并使用`可序列化`隔离级别报告警告。读取通常在使用`可序列化`grant表不支持隔离级别。
