#### 13.7.1.1 ALTER USER 声明

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

```
ALTER USER [IF EXISTS]
    user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...
    [COMMENT 'comment_string' | ATTRIBUTE 'json_object']

ALTER USER [IF EXISTS]
    USER() user_func_auth_option

ALTER USER [IF EXISTS]
    user [registration_option]

ALTER USER [IF EXISTS]
    USER() [registration_option]

ALTER USER [IF EXISTS]
    user DEFAULT ROLE
    {NONE | ALL | role [, role ] ...}

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED BY RANDOM PASSWORD
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | DISCARD OLD PASSWORD
  | ADD factor factor_auth_option [ADD factor factor_auth_option]
  | MODIFY factor factor_auth_option [MODIFY factor factor_auth_option]
  | DROP factor [DROP factor]
}

user_func_auth_option: {
    IDENTIFIED BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | DISCARD OLD PASSWORD
}

factor_auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
}

registration_option: {
    factor INITIATE REGISTRATION
  | factor FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'auth_string'
  | factor UNREGISTER
}

factor: {2 | 3} FACTOR

tls_option: {
   SSL
 | X509
 | CIPHER 'cipher'
 | ISSUER 'issuer'
 | SUBJECT 'subject'
}

resource_option: {
    MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

password_option: {
    PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
  | PASSWORD HISTORY {DEFAULT | N}
  | PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
  | PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
  | FAILED_LOGIN_ATTEMPTS N
  | PASSWORD_LOCK_TIME {N | UNBOUNDED}
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}
```

这[`更改用户`](alter-user.html)语句修改 MySQL 帐户。它允许为现有帐户修改身份验证、角色、SSL/TLS、资源限制、密码管理、注释和属性属性。它还可用于锁定和解锁帐户。

在大多数情况下，[`更改用户`](alter-user.html)需要全局[`创建用户`](privileges-provided.html#priv_create-user)特权，或[`更新`](privileges-provided.html#priv_update)的特权`mysql`系统架构。例外情况是：

-   任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。（特别是，您可以更改自己的密码。）要查看服务器对您进行身份验证的帐户，请调用[`当前用户（）`](information-functions.html#function_current-user)功能：

    ```
    SELECT CURRENT_USER();
    ```

-   为了`默认角色`句法，[`更改用户`](alter-user.html)需要这些特权：

    -   为其他用户设置默认角色需要全局[`创建用户`](privileges-provided.html#priv_create-user)特权，或[`更新`](privileges-provided.html#priv_update)的特权`mysql.default_roles`系统表。

    -   为自己设置默认角色不需要特殊权限，只要您希望作为默认角色的角色已授予您。

-   修改二级密码的语句需要以下权限：

    -   这[`APPLICATION_PASSWORD_ADMIN`](privileges-provided.html#priv_application-password-admin)需要特权才能使用`保留当前密码`要么`丢弃旧密码`条款[`更改用户`](alter-user.html)适用于您自己帐户的声明。操作您自己的二级密码需要该权限，因为大多数用户只需要一个密码。

    -   如果要允许一个帐户操纵所有帐户的二级密码，则需要[`创建用户`](privileges-provided.html#priv_create-user)特权而不是[`APPLICATION_PASSWORD_ADMIN`](privileges-provided.html#priv_application-password-admin).

    当。。。的时候[`只读`](server-system-variables.html#sysvar_read_only)系统变量已启用，[`更改用户`](alter-user.html)另外需要[`CONNECTION_ADMIN`](privileges-provided.html#priv_connection-admin)特权（或已弃用的[`极好的`](privileges-provided.html#priv_super)特权）。

    从 MySQL 8.0.27 开始，这些额外的特权注意事项适用：

-   这[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)系统变量对认证相关的子句如何[`更改用户`](alter-user.html)可以使用语句；有关详细信息，请参阅该变量的说明。如果您有[`AUTHENTICATION_POLICY_ADMIN`](privileges-provided.html#priv_authentication-policy-admin)特权。

-   要修改使用无密码身份验证的帐户，您必须拥有[`PASSWORDLESS_USER_ADMIN`](privileges-provided.html#priv_passwordless-user-admin)特权。

    默认情况下，如果您尝试修改不存在的用户，则会发生错误。如果`如果存在`给定子句时，该语句会为每个不存在的命名用户生成警告，而不是错误。

重要的

在某些情况下，[`更改用户`](alter-user.html)可以记录在服务器日志中，也可以记录在客户端的历史文件中，例如`~/.mysql_history`，这意味着任何有权读取该信息的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息，请参阅[第 6.1.2.3 节，“密码和日志记录”](password-logging.html).有关客户端日志记录的类似信息，请参阅[第 4.5.1.3 节，“mysql 客户端日志记录”](mysql-logging.html).

有几个方面的[`更改用户`](alter-user.html)声明，在以下主题下进行描述：

-   [ALTER 用户概述](alter-user.html#alter-user-overview)

-   [ALTER USER 身份验证选项](alter-user.html#alter-user-authentication)

-   [ALTER USER 多重身份验证选项](alter-user.html#alter-user-multifactor-authentication)

-   [ALTER USER 注册选项](alter-user.html#alter-user-registration-)

-   [ALTER USER 角色选项](alter-user.html#alter-user-role)

-   [ALTER USER SSL/TLS 选项](alter-user.html#alter-user-tls)

-   [ALTER USER 资源限制选项](alter-user.html#alter-user-resource-limits)

-   [ALTER USER 密码管理选项](alter-user.html#alter-user-password-management)

-   [ALTER USER 注释和属性选项](alter-user.html#alter-user-comments-attributes)

-   [ALTER USER 帐户锁定选项](alter-user.html#alter-user-account-locking)

-   [ALTER USER 二进制日志](alter-user.html#alter-user-binary-logging)

##### ALTER 用户概述

对于每个受影响的帐户，[`更改用户`](alter-user.html)修改对应的行`mysql.user`系统表以反映语句中指定的属性。未指定的属性保留其当前值。

每个帐户名称都使用中描述的格式[第 6.2.4 节，“指定帐户名称”](account-names.html).账户名的主机名部分，如果省略，默认为`'%'`.也可以指定[`当前用户`](information-functions.html#function_current-user)要么[`当前用户（）`](information-functions.html#function_current-user)引用与当前会话关联的帐户。

仅对于一种语法，帐户可以用[`用户（）`](information-functions.html#function_user)功能：

```
ALTER USER USER() IDENTIFIED BY 'auth_string';
```

此语法允许更改您自己的密码，而无需按字面命名您的帐户。（该语法还支持`代替`,`保留当前密码`， 和`丢弃旧密码`条款描述在[ALTER USER 身份验证选项](alter-user.html#alter-user-authentication).)

为了[`更改用户`](alter-user.html)允许的语法*`auth_option`*遵循的价值*`用户`*价值，*`auth_option`*指示帐户如何通过指定帐户身份验证插件、凭据（例如密码）或两者来进行身份验证。每个*`auth_option`*价值适用*只要*到它之前命名的帐户。

继*`用户`*规范中，该语句可能包括 SSL/TLS、资源限制、密码管理和锁定属性的选项。所有这些选项都是*全球的*声明并适用于*全部*声明中指定的账户。

示例：更改帐户密码并使其过期。因此，用户必须使用指定密码进行连接，并在下一次连接时选择一个新密码：

```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password' PASSWORD EXPIRE;
```

示例：修改帐户以使用`cache_sha2_password`身份验证插件和给定的密码。要求每 180 天选择一个新密码，并启用登录失败跟踪，以便连续三个错误密码导致帐户临时锁定两天：

```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
```

示例：锁定或解锁帐户：

```
ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK;
ALTER USER 'jeffrey'@'localhost' ACCOUNT UNLOCK;
```

示例：要求一个帐户使用 SSL 连接并建立每小时 20 个连接的限制：

```
ALTER USER 'jeffrey'@'localhost'
  REQUIRE SSL WITH MAX_CONNECTIONS_PER_HOUR 20;
```

示例：更改多个帐户，指定一些每个帐户的属性和一些全局属性：

```
ALTER USER
  'jeffrey'@'localhost'
    IDENTIFIED BY 'jeffrey_new_password',
  'jeanne'@'localhost',
  'josh'@'localhost'
    IDENTIFIED BY 'josh_new_password'
    REPLACE 'josh_current_password'
    RETAIN CURRENT PASSWORD
  REQUIRE SSL WITH MAX_USER_CONNECTIONS 2
  PASSWORD HISTORY 5;
```

这`由`价值跟随`杰弗里`仅适用于其前一个帐户，因此它将密码更改为`'*`jeffrey_new_password`*'`只为`杰弗里`.为了`珍妮`，没有每个帐户的值（因此保持密码不变）。为了`乔希`,`由`建立一个新密码（`'*`josh_new_password`*'`),`代替`被指定来验证用户发出[`更改用户`](alter-user.html)语句知道当前密码 (`'*`josh_current_password`*'`)，并且该当前密码也保留为帐户二级密码。（因此，`乔希`可以使用主密码或辅助密码进行连接。）

其余属性全局应用于语句中命名的所有帐户，因此对于两个帐户：

-   使用 SSL 需要连接。

-   该帐户最多可用于两个同时连接。

-   密码更改不能重复使用五个最近的密码中的任何一个。

    示例：丢弃二级密码`乔希`，只留下主密码：


```
ALTER USER 'josh'@'localhost' DISCARD OLD PASSWORD;
```

在没有特定类型的选项的情况下，账户在这方面保持不变。例如，没有锁定选项，帐户的锁定状态不会改变。

##### ALTER USER 身份验证选项

帐户名后面可以跟一个*`auth_option`*指定帐户身份验证插件、凭据或两者的身份验证选项。它还可能包括一个密码验证子句，该子句指定要替换的帐户当前密码，以及管理帐户是否具有辅助密码的子句。

笔记

随机密码生成、密码验证和辅助密码的条款仅适用于使用身份验证插件的帐户，该插件在内部将凭据存储到 MySQL。对于使用针对 MySQL 外部凭证系统执行身份验证的插件的帐户，密码管理也必须在外部针对该系统进行处理。有关内部凭据存储的更多信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

-   *`auth_plugin`*命名身份验证插件。插件名称可以是带引号的字符串文字或不带引号的名称。插件名称存储在`插入`的列`mysql.user`系统表。

    为了*`auth_option`*不指定身份验证插件的语法，服务器分配默认插件，如中所述确定[默认身份验证插件](pluggable-authentication.html#pluggable-authentication-default-plugin).有关每个插件的说明，请参阅[第 6.4.1 节，“身份验证插件”](authentication-plugins.html).

-   内部存储的凭据存储在`mysql.user`系统表。一个`'*`auth_string`*'`价值或`随机密码`指定帐户凭据，可以是明文（未加密）字符串，也可以是与帐户关联的身份验证插件期望的格式散列，分别：

    -   对于使用的语法`经过 '*`auth_string`*'`，字符串是明文并被传递给身份验证插件以进行可能的散列。插件返回的结果存储在`mysql.user`桌子。插件可以使用指定的值，在这种情况下不会发生散列。

    -   对于使用的语法`通过随机密码`, MySQL 生成一个随机密码并以明文形式传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在`mysql.user`桌子。插件可以使用指定的值，在这种情况下不会发生散列。

        随机生成的密码自 MySQL 8.0.18 起可用，并具有中描述的特征[随机密码生成](password-management.html#random-password-generation).

    -   对于使用的语法`作为 '*`auth_string`*'`, 字符串假定已经是认证插件所需的格式，并按原样存储在`mysql.user`桌子。如果插件需要散列值，则该值必须已经以适合插件的格式散列；否则，插件无法使用该值，并且不会发生客户端连接的正确身份验证。

        从 MySQL 8.0.17 开始，散列字符串可以是字符串文字或十六进制值。后者对应于显示的值的类型[`显示创建用户`](show-create-user.html)对于包含不可打印字符的密码哈希，当[`print_identified_with_as_hex`](server-system-variables.html#sysvar_print_identified_with_as_hex)系统变量已启用。

    -   如果身份验证插件不执行身份验证字符串的散列，则`经过 '*`auth_string`*'`和`作为 '*`auth_string`*'`子句具有相同的效果：身份验证字符串按原样存储在`mysql.user`系统表。

-   这`代替 '*`current_auth_string`*'`子句执行密码验证，从 MySQL 8.0.13 开始可用。如果给出：

    -   `代替`指定要替换的帐户当前密码，作为明文（未加密）字符串。

    -   如果需要更改密码以指定当前密码，则必须给出该子句，以验证尝试进行更改的用户实际上知道当前密码。

    -   如果帐户的密码更改可能但不需要指定当前密码，则该子句是可选的。

    -   如果给出了该子句但与当前密码不匹配，则该语句将失败，即使该子句是可选的。

    -   `代替`只有在更改当前用户的帐户密码时才能指定。

        有关通过指定当前密码进行密码验证的详细信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

-   这`保留当前密码`和`丢弃旧密码`子句实现双密码功能，并且从 MySQL 8.0.14 开始可用。两者都是可选的，但如果给定，则具有以下效果：

    -   `保留当前密码`保留帐户当前密码作为其二级密码，替换任何现有的二级密码。新密码成为主密码，但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。（例外：如果新密码由[`更改用户`](alter-user.html)语句为空，二级密码也为空，即使`保留当前密码`给出。）

    -   如果您指定`保留当前密码`对于主密码为空的帐户，该语句将失败。

    -   如果帐户有二级密码，而您更改其主密码但未指定`保留当前密码`，二级密码保持不变。

    -   如果您更改分配给该帐户的身份验证插件，则二级密码将被丢弃。如果您更改身份验证插件并指定`保留当前密码`, 语句失败。

    -   `丢弃旧密码`丢弃二级密码（如果存在）。该帐户仅保留其主密码，客户端可以使用该帐户仅通过主密码连接到服务器。

        有关使用双重密码的更多信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

[`更改用户`](alter-user.html)允许这些*`auth_option`*语法：

-   `由'*标识`auth_string`*' [代替 '*`current_auth_string`*'] [保留当前密码]`

    将账户认证插件设置为默认插件，通过明文`'*`auth_string`*'`插件的值以进行可能的散列，并将结果存储在帐户行中`mysql.user`系统表。

    这`代替`子句（如果给定）指定帐户当前密码，如本节前面所述。

    这`保留当前密码`子句，如果给定，会导致帐户当前密码保留为其辅助密码，如本节前面所述。

-   `由随机密码识别[替换'*`current_auth_string`*'] [保留当前密码]`

    将帐户身份验证插件设置为默认插件，生成随机密码，将明文密码值传递给插件以进行可能的哈希处理，并将结果存储在`mysql.user`系统表。该语句还在结果集中返回明文密码，以使其可供执行该语句的用户或应用程序使用。随机生成密码的结果集和特征，请参见[随机密码生成](password-management.html#random-password-generation).

    这`代替`子句（如果给定）指定帐户当前密码，如本节前面所述。

    这`保留当前密码`子句，如果给定，会导致帐户当前密码保留为其辅助密码，如本节前面所述。

-   `标识为 *`auth_plugin`*`

    将帐户身份验证插件设置为*`auth_plugin`*，将凭证清除为空字符串（凭证与旧的身份验证插件相关联，而不是新的），并将结果存储在`mysql.user`系统表。

    此外，密码被标记为过期。用户下次连接时必须选择一个新的。

-   `标识为 *`auth_plugin`* 经过 '*`auth_string`*' [代替 '*`current_auth_string`*'] [保留当前密码]`

    将帐户身份验证插件设置为*`auth_plugin`*，通过明文`'*`auth_string`*'`插件的值以进行可能的散列，并将结果存储在帐户行中`mysql.user`系统表。

    这`代替`子句（如果给定）指定帐户当前密码，如本节前面所述。

    这`保留当前密码`子句，如果给定，会导致帐户当前密码保留为其辅助密码，如本节前面所述。

-   `标识为 *`auth_plugin`*通过随机密码[替换'*`current_auth_string`*'] [保留当前密码]`

    将帐户身份验证插件设置为*`auth_plugin`*，生成一个随机密码，将明文密码值传递给插件进行可能的哈希处理，并将结果存储在`mysql.user`系统表。该语句还在结果集中返回明文密码，以使其可供执行该语句的用户或应用程序使用。随机生成密码的结果集和特征，请参见[随机密码生成](password-management.html#random-password-generation).

    这`代替`子句（如果给定）指定帐户当前密码，如本节前面所述。

    这`保留当前密码`子句，如果给定，会导致帐户当前密码保留为其辅助密码，如本节前面所述。

-   `标识为 *`auth_plugin`* 作为 '*`auth_string`*'`

    将帐户身份验证插件设置为*`auth_plugin`*并存储`'*`auth_string`*'`价值在`mysql.user`帐户行。如果插件需要散列字符串，则假定该字符串已按照插件所需的格式进行散列。

-   `丢弃旧密码`

    如本节前面所述，丢弃帐户二级密码（如果有）。

    示例：将密码指定为明文；使用默认插件：


```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'password';
```

示例：指定身份验证插件以及明文密码值：

```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'password';
```

示例：与前面的示例类似，但此外，将当前密码指定为明文值，以满足进行更改的用户知道该密码的任何帐户要求：

```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'password'
             REPLACE 'current_password';
```

前面的语句失败，除非当前用户是`杰弗里`因为`代替`仅允许更改当前用户的密码。

示例：建立新的主密码并保留现有密码作为辅助密码：

```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password'
  RETAIN CURRENT PASSWORD;
```

示例：丢弃二级密码，只留下主密码：

```
ALTER USER 'jeffery'@'localhost' DISCARD OLD PASSWORD;
```

示例：指定身份验证插件以及散列密码值：

```
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
```

有关设置密码和身份验证插件的更多信息，请参阅[第 6.2.14 节，“分配帐户密码”](assigning-passwords.html)， 和[第 6.2.17 节，“可插拔身份验证”](pluggable-authentication.html).

##### ALTER USER 多重身份验证选项

从 MySQL 8.0.27 开始，[`更改用户`](alter-user.html)已`添加`,`调整`， 和`降低`允许添加、修改或删除身份验证因素的子句。在每种情况下，该子句都指定了对一个身份验证因素执行的操作，以及可选的对另一个身份验证因素的操作。对于每个操作，*`因素`*项指定`因素`前面带有数字2或3的关键字，以指示该操作是否应用于第二个或第三个身份验证因子。（1）在这种情况下是不允许的。要对第一个身份验证因素采取行动，请使用中描述的语法[更改用户身份验证选项](alter-user.html#alter-user-authentication).)

[`改变用户`](alter-user.html)多因素身份验证子句约束由[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)系统变量。例如[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)设置控制帐户可能具有的身份验证因素的数量，以及每个因素允许使用哪些身份验证方法。看见[配置多因素身份验证策略](multifactor-authentication.html#multifactor-authentication-policy).

什么时候[`改变用户`](alter-user.html)在一条语句中添加、修改或删除第二个和第三个因子，操作将按顺序执行，但如果序列中的任何操作失败，整个过程都将失败[`改变用户`](alter-user.html)声明失败。

对于`添加`，每个命名因子必须不存在或无法添加。对于`修改`和`滴`，每个命名因子必须存在才能修改或删除。如果定义了第二个和第三个因子，删除第二个因子会导致第三个因子取代第二个因子。

此声明删除了身份验证因素2和3，其作用是将帐户从3FA转换为1FA：

```
ALTER USER 'user' DROP 2 FACTOR 3 FACTOR;
```

额外的`添加`,`修改`和`滴`示例，请参见[多因素身份验证入门](multifactor-authentication.html#multifactor-authentication-getting-started).

有关为未命名插件的验证条款确定默认验证插件的因子特定规则的信息，请参阅[默认的身份验证插件](pluggable-authentication.html#pluggable-authentication-default-plugin).

##### 更改用户注册选项

从MySQL 8.0.27开始，[`改变用户`](alter-user.html)有允许注册和取消注册FIDO设备的条款。有关更多信息，请参阅[使用FIDO身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-usage), [FIDO设备注销](fido-pluggable-authentication.html#fido-pluggable-authentication-unregistration)，以及[**mysql**](mysql.html)客户[`--fido寄存器因子`](mysql-command-options.html#option_mysql_fido-register-factor)选项说明。

这个[**mysql**](mysql.html)客户[`--fido寄存器因子`](mysql-command-options.html#option_mysql_fido-register-factor)用于FIDO设备注册的选项会导致[**mysql**](mysql.html)客户端生成并执行`发起注册`和`完成注册`声明。这些语句不适用于手动执行。

##### 改变用户角色选项

[](<>)

[`改变用户。。。默认角色`](alter-user.html)定义当用户连接到服务器并进行身份验证时，或当用户执行[`设置角色默认值`](set-role.html)在会议期间发表的声明。

[`改变用户。。。默认角色`](alter-user.html)是的替代语法[`设置默认角色`](set-default-role.html)（见[第13.7.1.9节，“设置默认角色声明”](set-default-role.html)).然而，[`改变用户`](alter-user.html)只能为单个用户设置默认值，而[`设置默认角色`](set-default-role.html)可以为多个用户设置默认值。另一方面，您可以指定`当前用户`作为[`改变用户`](alter-user.html)声明，而你不能[`设置默认角色`](set-default-role.html).

每个用户帐户名都使用前面描述的格式。

每个角色名称使用中描述的格式[第6.2.5节“指定角色名称”](role-names.html).例如：

```
ALTER USER 'joe'@'10.0.0.1' DEFAULT ROLE administrator, developer;
```

角色名的主机名部分（如果省略）默认为`'%'`.

下列条款`默认角色`关键词允许这些值：

-   `没有一个`：将默认设置为`没有一个`（没有角色）。

-   `全部的`：将默认设置为授予帐户的所有角色。

-   `*`角色`* [, *`角色`* ] ...`：将默认值设置为命名角色，该角色必须存在并在当时授予该帐户[`改变用户。。。默认角色`](alter-user.html)被处决了。

##### 更改用户SSL/TLS选项

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

除了基于用户名和凭据的常规身份验证之外，MySQL还可以检查X.509证书属性。有关在MySQL中使用SSL/TLS的背景信息，请参阅[第6.3节，“使用加密连接”](encrypted-connections.html).

要为MySQL帐户指定与SSL/TLS相关的选项，请使用`要求`指定一个或多个*`tls_选项`*价值观

秩序`要求`选项无关紧要，但任何选项都不能指定两次。这个`和`关键字是可选的`要求`选项。

[`改变用户`](alter-user.html)允许这些*`tls_选项`*价值观：

-   `没有一个`

    指示由该对账单命名的所有帐户没有SSL或X.509要求。如果用户名和密码有效，则允许未加密的连接。如果客户机拥有正确的证书和密钥文件，则可以根据客户机的选择使用加密连接。

    ```
    ALTER USER 'jeffrey'@'localhost' REQUIRE NONE;
    ```

    默认情况下，客户端尝试建立安全连接。对于那些`不需要`，如果无法建立安全连接，则连接尝试会退回到未加密的连接。要要求加密连接，客户端只需指定[`--ssl模式=必需`](connection-options.html#option_general_ssl-mode)选项如果无法建立安全连接，连接尝试将失败。

-   `SSL`

    告诉服务器只允许对该语句指定的所有帐户进行加密连接。

    ```
    ALTER USER 'jeffrey'@'localhost' REQUIRE SSL;
    ```

    默认情况下，客户端尝试建立安全连接。对于已经`需要SSL`，如果无法建立安全连接，则连接尝试失败。

-   `X509`

    对于声明中指定的所有帐户，要求客户提供有效的证书，但确切的证书、颁发者和主题无关紧要。唯一的要求是，应该可以使用其中一个CA证书验证其签名。使用X.509证书总是意味着加密，所以`SSL`在这种情况下，选项是不必要的。

    ```
    ALTER USER 'jeffrey'@'localhost' REQUIRE X509;
    ```

    与…打交道`需要X509`，客户端必须指定[`--ssl密钥`](connection-options.html#option_general_ssl-key)和[`--ssl证书`](connection-options.html#option_general_ssl-cert)连接选项。（建议但不要求：[`--ssl ca`](connection-options.html#option_general_ssl-ca)也可以指定，以便验证服务器提供的公共证书。）这对我来说是真的`发行人`和`主题`也因为那些`要求`选项意味着`X509`.

-   `发行人的*`发行人`*'`

    对于声明中指定的所有帐户，要求客户端提供CA颁发的有效X.509证书`'*`发行人`*'`。如果客户端提供的证书有效，但具有不同的颁发者，则服务器会拒绝连接。使用X.509证书总是意味着加密，所以`SSL`在这种情况下，选项是不必要的。

    ```
    ALTER USER 'jeffrey'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/emailAddress=ca@example.com';
    ```

    因为`发行人`意味着`X509`，客户端必须指定[`--ssl密钥`](connection-options.html#option_general_ssl-key)和[`--ssl证书`](connection-options.html#option_general_ssl-cert)连接选项。（建议但不要求：[`--ssl ca`](connection-options.html#option_general_ssl-ca)也可以指定，以便验证服务器提供的公共证书。）

-   `受试者的*`主题`*'`

    对于由对账单命名的所有帐户，要求客户端提供包含主题的有效X.509证书*`主题`*。如果客户端提供的证书有效但主题不同，则服务器会拒绝连接。使用X.509证书总是意味着加密，所以`SSL`在这种情况下，选项是不必要的。

    ```
    ALTER USER 'jeffrey'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/emailAddress=client@example.com';
    ```

    MySQL对`'*`主题`*'`证书中的值，因此必须提供与证书中所示完全相同的信盒和部件订购。

    因为`主题`意味着`X509`，客户端必须指定[`--ssl密钥`](connection-options.html#option_general_ssl-key)和[`--ssl证书`](connection-options.html#option_general_ssl-cert)连接选项。（建议但不要求：[`--ssl ca`](connection-options.html#option_general_ssl-ca)也可以指定，以便验证服务器提供的公共证书。）

-   `密码'*`密码`*'`

    对于由语句命名的所有帐户，需要使用特定的密码方法来加密连接。需要使用此选项以确保使用足够强度的密码和密钥长度。如果使用使用短加密密钥的旧算法，加密可能会很弱。

    ```
    ALTER USER 'jeffrey'@'localhost'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
    ```

    这个`主题`, `发行人`和`密码`选项可以组合在`要求`条款：


```
ALTER USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/emailAddress=client@example.com'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/emailAddress=ca@example.com'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
```

##### 更改用户资源限制选项

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

可以限制帐户使用服务器资源，如中所述[第6.2.21节“设置账户资源限制”](user-resources.html).为此，请使用`具有`指定一个或多个*`资源选项`*价值观

秩序`具有`选项无关紧要，但如果多次指定给定的资源限制，则最后一个实例优先。

[`改变用户`](alter-user.html)允许这些*`资源选项`*价值观：

-   `每小时最大查询次数*`计数`*`, `每小时最大更新次数*`计数`*`, `每小时最大连接数*`计数`*`

    对于由语句命名的所有帐户，这些选项限制在任何给定的一小时内每个帐户允许的查询、更新和到服务器的连接数。如果*`计数`*是`0`（默认设置），这意味着该帐户没有限制。

-   `最大用户连接数*`计数`*`

    对于由语句命名的所有帐户，限制每个帐户同时连接到服务器的最大数量。非零*`计数`*明确指定帐户的限制。如果*`计数`*是`0`（默认情况下），服务器根据帐户的全局值确定帐户的同时连接数[`最大用户连接数`](server-system-variables.html#sysvar_max_user_connections)系统变量。如果[`最大用户连接数`](server-system-variables.html#sysvar_max_user_connections)也为零，帐户没有限制。

    例子：


```
ALTER USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
```

##### 更改用户密码管理选项

[`改变用户`](alter-user.html)支持几个*`密码选项`*密码管理的值：

-   密码过期选项：您可以手动使帐户密码过期，并建立其密码过期策略。策略选项不会使密码过期。相反，它们决定服务器如何根据密码期限对帐户应用自动过期，密码期限从最近一次帐户密码更改的日期和时间开始评估。

-   密码重用选项：您可以根据密码更改的次数、经过的时间或两者来限制密码重用。

-   密码验证必需选项：您可以指示更改帐户密码的尝试是否必须指定当前密码，以验证尝试进行更改的用户是否确实知道当前密码。

-   密码错误登录失败跟踪选项：您可能会导致服务器跟踪失败的登录尝试，并暂时锁定连续提供过多错误密码的帐户。所需的故障次数和锁定时间是可配置的。

    本节介绍密码管理选项的语法。有关建立密码管理策略的信息，请参阅[第6.2.15节“密码管理”](password-management.html).

    如果指定了给定类型的多个密码管理选项，则以最后一个为准。例如`密码过期默认密码永不过期`和`密码永不过期`.

笔记

除了与登录跟踪失败相关的选项外，密码管理选项仅适用于使用身份验证插件的帐户，该插件在MySQL内部存储凭据。对于使用插件对MySQL外部的凭据系统执行身份验证的帐户，密码管理也必须针对该系统进行外部处理。有关内部凭据存储的更多信息，请参阅[第6.2.15节“密码管理”](password-management.html).

如果帐户密码手动过期，或者根据自动过期策略，密码期限被视为大于其允许的使用期限，则客户端的密码已过期。在这种情况下，服务器要么断开客户机的连接，要么限制其允许的操作（请参阅）[第6.2.16节，“过期密码的服务器处理”](expired-password-handling.html))。在用户建立新帐户密码之前，受限客户端执行的操作会导致错误。

笔记

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

[`改变用户`](alter-user.html)允许这些*`密码选项`*用于控制密码过期的值：

-   `密码过期`

    立即将声明中指定的所有帐户的密码标记为过期。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
    ```

-   `密码过期默认值`

    设置由语句命名的所有帐户，以便按照[`默认密码生命周期`](server-system-variables.html#sysvar_default_password_lifetime)系统变量。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    ```

-   `密码永不过期`

    此过期选项将覆盖对账单指定的所有帐户的全局策略。对于每个密码，它都会禁用密码过期，以便密码永远不会过期。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    ```

-   `密码过期时间间隔*`N`*一天`

    此过期选项将覆盖对账单指定的所有帐户的全局策略。对于每个密码，它将密码生存期设置为*`N`*天。以下语句要求每180天更改一次密码：

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;
    ```

[`改变用户`](alter-user.html)允许这些*`密码选项`*用于根据所需的最小密码更改次数控制以前密码的重复使用的值：

-   `密码历史记录默认值`

    设置由语句命名的所有帐户，以便应用有关密码历史记录长度的全局策略，以禁止在语句指定的更改次数之前重用密码[`密码历史`](server-system-variables.html#sysvar_password_history)系统变量。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
    ```

-   `密码历史记录*`N`*`

    此历史长度选项将覆盖由该语句命名的所有帐户的全局策略。对于每个密码，它将密码历史记录长度设置为*`N`*密码，以禁止重复使用任何*`N`*最近选择的密码。以下声明禁止重复使用前6个密码中的任何一个：

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 6;
    ```

[`改变用户`](alter-user.html)允许这些*`密码选项`*用于根据经过的时间控制以前密码的重复使用的值：

-   `密码重复使用间隔默认值`

    设置由帐户命名的所有语句，以便应用有关已用时间的全局策略，以禁止重新使用比帐户指定的天数新的密码[`密码_重用_间隔`](server-system-variables.html#sysvar_password_reuse_interval)系统变量。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
    ```

-   `密码重复使用间隔*`N`*一天`

    此“已用时间”选项将覆盖由该语句命名的所有帐户的全局策略。对于每个密码，它将密码重用间隔设置为*`N`*禁止重复使用比这几天更新的密码。以下声明禁止在360天内重复使用密码：

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;
    ```

[`改变用户`](alter-user.html)允许这些*`密码选项`*用于控制是否尝试更改帐户密码的值必须指定当前密码，以验证尝试更改的用户是否确实知道当前密码：

-   `密码需要当前密码`

    此验证选项将覆盖对账单指定的所有帐户的全局策略。对于每个密码，它要求密码更改指定当前密码。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
    ```

-   `密码要求当前可选`

    此验证选项将覆盖对账单指定的所有帐户的全局策略。对于每个密码，它不要求密码更改指定当前密码。（可以提供但不需要提供当前密码。）

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
    ```

-   `密码需要当前默认值`

    设置由帐户命名的所有语句，以便按照[`密码\u需要\u当前密码`](server-system-variables.html#sysvar_password_require_current)系统变量。

    ```
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
    ```

    从MySQL 8.0.19开始，[`改变用户`](alter-user.html)允许这些*`密码选项`*用于控制失败登录跟踪的值：

-   `登录尝试失败*`N`*`

    是否跟踪指定错误密码的帐户登录尝试。*`N`*必须是0到32767之间的数字。值为0将禁用失败的登录跟踪。大于0的值表示有多少连续密码失败会导致临时帐户锁定（如果`密码锁定时间`也不是零）。

-   `密码锁定时间{*`N`*|无界}`

    连续多次登录尝试提供错误密码后锁定帐户的时间。*`N`*必须是0到32767之间的数字，或`无限的`.值为0将禁用临时帐户锁定。大于0的值表示以天为单位锁定帐户的时间。价值`无限的`使帐户锁定持续时间不受限制；一旦锁定，帐户将保持锁定状态，直到解锁。有关解锁条件的信息，请参阅[登录跟踪和临时帐户锁定失败](password-management.html#failed-login-tracking).

    对于失败的登录跟踪和临时锁定，帐户的`登录尝试失败`和`密码锁定时间`选项都必须为非零。以下语句修改帐户，使其在连续四次密码失败后保持锁定两天：


```
ALTER USER 'jeffrey'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
```

##### 更改用户注释和属性选项

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

MySQL 8.0.21及更高版本支持用户评论和用户属性，如中所述[第13.7.1.3节“创建用户声明”](create-user.html).这些可通过以下方式进行修改：`改变用户`通过`议论`和`属性`选项，分别。不能同时指定两个选项`改变用户`陈述尝试这样做会导致语法错误。

用户注释和用户属性存储在[`信息模式。用户属性`](information-schema-user-attributes-table.html)表作为JSON对象；用户注释存储为`议论`输入此表的属性列，如本讨论后面所示。这个`议论`文本可以是任意引用的文本，并替换任何现有的用户评论。这个`属性`值必须是JSON对象的有效字符串表示形式。这将与任何现有的用户属性合并，就像[`JSON_MERGE_PATCH（）`](json-modification-functions.html#function_json-merge-patch)函数已在现有用户属性和新用户属性上使用；对于重复使用的任何键，新值将覆盖旧值，如下所示：

```
mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"foo": "bar"} |
+------+-----------+----------------+
1 row in set (0.11 sec)

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"baz": "faz", "foo": "moo"}';
Query OK, 0 rows affected (0.22 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+------------------------------+
| USER | HOST      | ATTRIBUTE                    |
+------+-----------+------------------------------+
| bill | localhost | {"baz": "faz", "foo": "moo"} |
+------+-----------+------------------------------+
1 row in set (0.00 sec)
```

要从用户属性中删除密钥及其值，请将密钥设置为JSON`无效的`（必须小写且不带引号），如下所示：

```
mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"foo": null}';
Query OK, 0 rows affected (0.08 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"baz": "faz"} |
+------+-----------+----------------+
1 row in set (0.00 sec)
```

要将现有用户注释设置为空字符串，请使用`改变用户。。。评论“`.这会留下一个空的`议论`价值观[`用户属性`](information-schema-user-attributes-table.html)桌子要完全删除用户评论，请使用`改变用户。。。属性`将列键的值设置为JSON`无效的`（小写，不带引号）。下面的SQL语句序列说明了这一点：

```
mysql> ALTER USER 'bill'@'localhost' COMMENT 'Something about Bill';
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+---------------------------------------------------+
| USER | HOST      | ATTRIBUTE                                         |
+------+-----------+---------------------------------------------------+
| bill | localhost | {"baz": "faz", "comment": "Something about Bill"} |
+------+-----------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'bill'@'localhost' COMMENT '';
Query OK, 0 rows affected (0.09 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+-------------------------------+
| USER | HOST      | ATTRIBUTE                     |
+------+-----------+-------------------------------+
| bill | localhost | {"baz": "faz", "comment": ""} |
+------+-----------+-------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"comment": null}';
Query OK, 0 rows affected (0.07 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"baz": "faz"} |
+------+-----------+----------------+
1 row in set (0.00 sec)
```

##### 更改用户帐户锁定选项

[](<>)

MySQL支持使用`帐户锁`和`帐户解锁`选项，指定帐户的锁定状态。有关更多讨论，请参阅[第6.2.20节“账户锁定”](account-locking.html).

如果指定了多个帐户锁定选项，则最后一个选项优先。

从MySQL 8.0.19开始，[`改变用户。。。解锁`](alter-user.html)解除锁定由于登录失败次数过多而被临时锁定的语句所指定的任何帐户。看见[第6.2.15节“密码管理”](password-management.html).

##### 改变用户二进制日志记录

[](<>)

[`改变用户`](alter-user.html)如果成功，则写入二进制日志，但如果失败则不写入；在这种情况下，会发生回滚，并且不会进行任何更改。写入二进制日志的语句包括所有命名用户。如果`如果存在`子句，这甚至包括不存在且未被更改的用户。

如果原始语句更改了用户的凭据，则写入二进制日志的语句将指定该用户适用的身份验证插件，确定如下：

-   原始语句中指定的插件（如果已指定）。

-   否则，如果用户存在，则为与用户帐户关联的插件；如果用户不存在，则为默认身份验证插件。（如果写入二进制日志的语句必须为用户指定特定的身份验证插件，请将其包含在原始语句中。）

    如果服务器在写入二进制日志的语句中为任何用户添加默认的身份验证插件，它会向错误日志中写入一条警告，指明这些用户的名称。

    如果原始语句指定`登录尝试失败`或`密码锁定时间`选项，写入二进制日志的语句包括该选项。

[`改变用户`](alter-user.html)包含支持多因素身份验证（MFA）的子句的语句会写入二进制日志，但`改变用户*`用户因素`*发起注册`声明。

-   `改变用户*`用户因素`*完成注册集挑战_响应为'*`验证字符串`*'`语句以如下方式写入二进制日志：`改变用户*`使用者`*修改*`因素`*通过身份验证确认为*`fido_hash\_字符串`*`;

-   在复制上下文中，复制用户需要[`无密码用户管理员`](privileges-provided.html#priv_passwordless-user-admin)执行的特权`改变用户。。。修改`使用配置为无密码身份验证的帐户上的操作`身份验证`插件。
