文档主页
MySQL 9.0 参考手册
相关文档 下载本手册

MySQL 9.0 参考手册  /  ...  /  ALTER USER 语句

15.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 8.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 语句修改 MySQL 帐户。它允许修改现有帐户的身份验证、角色、SSL/TLS、资源限制、密码管理、注释和属性属性。它也可以用于锁定和解锁帐户。

在大多数情况下,ALTER USER 需要全局 CREATE USER 权限,或对 mysql 系统模式的 UPDATE 权限。例外情况是

  • 任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。(特别是,您可以更改自己的密码。)要查看服务器验证您使用的帐户,请调用 CURRENT_USER() 函数

    SELECT CURRENT_USER();
  • 对于 DEFAULT ROLE 语法,ALTER USER 需要以下权限

    • 设置另一个用户的默认角色需要全局 CREATE USER 权限,或对 mysql.default_roles 系统表的 UPDATE 权限。

    • 将默认角色设置为自己不需要任何特殊权限,只要您想要作为默认角色的角色已授予您即可。

  • 修改辅助密码的语句需要这些权限。

    • 使用 APPLICATION_PASSWORD_ADMIN 权限可以为 ALTER USER 语句使用 RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句,这些语句适用于您自己的帐户。因为大多数用户只需要一个密码,所以需要此权限来操作您自己的辅助密码。

    • 如果允许某个帐户为所有帐户操作辅助密码,则它需要 CREATE USER 权限,而不是 APPLICATION_PASSWORD_ADMIN 权限。

当启用 read_only 系统变量时,ALTER USER 还需要 CONNECTION_ADMIN 权限(或已弃用的 SUPER 权限)。

这些额外的权限注意事项也适用。

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

重要

在某些情况下,ALTER USER 可能会记录在服务器日志或客户端的历史文件(例如 ~/.mysql_history)中,这意味着任何拥有该信息读取权限的人都可以读取明文密码。有关服务器日志中出现此情况的条件以及如何控制它的信息,请参阅 第 8.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅 第 6.5.1.3 节,“mysql 客户端日志记录”

ALTER USER 语句包含多个方面,在以下主题中进行了描述。

ALTER USER 概述

对于每个受影响的帐户,ALTER USER 会修改 mysql.user 系统表中相应的行,以反映语句中指定的属性。未指定的属性将保留其当前值。

每个帐户名都使用 第 8.2.4 节,“指定帐户名” 中描述的格式。如果省略了帐户名的主机名部分,则默认为 '%'。也可以指定 CURRENT_USERCURRENT_USER() 来引用与当前会话关联的帐户。

只有一种情况下,可以使用 USER() 函数指定帐户。

ALTER USER USER() IDENTIFIED BY 'auth_string';

此语法允许在不直接命名帐户的情况下更改您自己的密码。(该语法还支持 ALTER USER 身份验证选项 中描述的 REPLACERETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句。)

对于允许 auth_option 值在 user 值之后出现的 ALTER USER 语法,auth_option 通过指定帐户身份验证插件、凭据(例如密码)或两者来指示帐户如何进行身份验证。每个 auth_option 值仅应用于紧接其前的命名帐户。

user 规范之后,语句可以包含 SSL/TLS、资源限制、密码管理和锁定属性的选项。所有这些选项都是针对语句的 全局 选项,并且适用于语句中命名的 所有 帐户。

示例:更改帐户的密码并使其过期。结果是,用户必须使用指定的密码连接,并在下次连接时选择一个新密码。

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

示例:修改帐户以使用 caching_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 后的 IDENTIFIED BY 值仅适用于紧接其前的帐户,因此它只更改了 jeffrey 的密码为 'jeffrey_new_password'。对于 jeanne,没有特定于帐户的值(因此密码保持不变)。对于 joshIDENTIFIED BY 建立了一个新密码('josh_new_password'),REPLACE 指定用于验证发出 ALTER USER 语句的用户是否知道当前密码('josh_current_password'),并且该当前密码也被保留为帐户的辅助密码。(结果,josh 可以使用主密码或辅助密码连接。)

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

  • 连接需要使用 SSL。

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

  • 密码更改不能重复使用最近的五次密码。

示例:丢弃 josh 的辅助密码,使该帐户只保留主密码。

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

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

ALTER USER 身份验证选项

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

注意

随机密码生成、密码验证和辅助密码的子句仅适用于使用内部存储凭据的身份验证插件的帐户。对于使用在 MySQL 外部进行身份验证的凭据系统的插件的帐户,必须在外部对该系统进行密码管理。有关内部凭据存储的更多信息,请参阅 第 8.2.15 节,“密码管理”

  • auth_plugin 指定身份验证插件的名称。插件名称可以是带引号的字符串字面量或不带引号的名称。插件名称存储在 mysql.user 系统表的 plugin 列中。

    对于没有指定身份验证插件的 auth_option 语法,服务器将分配默认插件,该插件的确定方式如 默认身份验证插件 中所述。有关每个插件的描述,请参阅 第 8.4.1 节,“身份验证插件”

  • 内部存储的凭据存储在 mysql.user 系统表中。一个 'auth_string' 值或 RANDOM PASSWORD 指定帐户凭据,可以是明文(未加密)字符串,也可以是与帐户关联的身份验证插件预期格式的哈希值。

    • 对于使用 BY 'auth_string' 的语法,该字符串是明文,并将传递给身份验证插件以进行可能的哈希运算。插件返回的结果将存储在 mysql.user 表中。插件可以使用指定的价值,在这种情况下不会进行哈希运算。

    • 对于使用 BY RANDOM PASSWORD 的语法,MySQL 将生成一个随机密码,并将其作为明文传递给身份验证插件以进行可能的哈希运算。插件返回的结果将存储在 mysql.user 表中。插件可以使用指定的价值,在这种情况下不会进行哈希运算。

      随机生成的密码具有 随机密码生成 中描述的特征。

    • 对于使用 AS 'auth_string' 的语法,该字符串被假定为已处于身份验证插件所需的格式,并将按原样存储在 mysql.user 表中。如果插件需要哈希值,则该值必须已使用适合插件的格式进行哈希运算;否则,该值将无法被插件使用,客户端连接的正确身份验证将不会发生。

      哈希字符串可以是字符串字面量或十六进制值。后者对应于 SHOW CREATE USER 为包含不可打印字符的密码哈希值显示的类型的值,前提是启用了 print_identified_with_as_hex 系统变量。

    • 如果身份验证插件不执行身份验证字符串的哈希运算,则 BY 'auth_string'AS 'auth_string' 子句的效果相同:身份验证字符串将按原样存储在 mysql.user 系统表中。

  • REPLACE 'current_auth_string' 子句执行密码验证。如果给出:

    • REPLACE 指定要替换的帐户当前密码,作为明文(未加密)字符串。

    • 如果要求帐户的密码更改指定当前密码,则必须给出该子句,作为对尝试进行更改的用户的验证,以确认他们实际上知道当前密码。

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

    • 如果给出该子句但不匹配当前密码,即使该子句是可选的,语句也会失败。

    • 只有在更改当前用户的帐户密码时,才能指定 REPLACE

    有关通过指定当前密码进行密码验证的更多信息,请参见第 8.2.15 节,“密码管理”

  • RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句实现双密码功能。两者都是可选的,但如果给出,则具有以下效果

    • RETAIN CURRENT PASSWORD 将帐户的当前密码保留为其辅助密码,替换任何现有的辅助密码。新密码将成为主密码,但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。(例外情况:如果 ALTER USER 语句指定的新的密码为空,即使给出 RETAIN CURRENT PASSWORD,辅助密码也会变为空。)

    • 如果您为具有空主密码的帐户指定 RETAIN CURRENT PASSWORD,则该语句将失败。

    • 如果帐户具有辅助密码,并且您在未指定 RETAIN CURRENT PASSWORD 的情况下更改其主密码,则辅助密码将保持不变。

    • 如果您更改分配给帐户的身份验证插件,则辅助密码将被丢弃。如果您更改身份验证插件并也指定 RETAIN CURRENT PASSWORD,则该语句将失败。

    • DISCARD OLD PASSWORD 将丢弃辅助密码(如果存在)。该帐户仅保留其主密码,并且客户端只能使用主密码使用该帐户连接到服务器。

    有关使用双密码的更多信息,请参见第 8.2.15 节,“密码管理”

ALTER USER 允许这些 auth_option 语法

  • IDENTIFIED BY 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    将帐户身份验证插件设置为默认插件,将明文 'auth_string' 值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表中的帐户行中。

    如果给出 REPLACE 子句,它将指定帐户的当前密码,如本节前面所述。

    如果给出 RETAIN CURRENT PASSWORD 子句,它将导致帐户的当前密码被保留为其辅助密码,如本节前面所述。

  • IDENTIFIED BY RANDOM PASSWORD [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    将帐户身份验证插件设置为默认插件,生成一个随机密码,将明文密码值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表中的帐户行中。该语句还在结果集中返回明文密码,以便将其提供给执行该语句的用户或应用程序。有关结果集和随机生成密码特征的详细信息,请参见随机密码生成

    如果给出 REPLACE 子句,它将指定帐户的当前密码,如本节前面所述。

    如果给出 RETAIN CURRENT PASSWORD 子句,它将导致帐户的当前密码被保留为其辅助密码,如本节前面所述。

  • IDENTIFIED WITH auth_plugin

    将帐户身份验证插件设置为 auth_plugin,将凭据清除为空字符串(凭据与旧身份验证插件相关联,而不是与新的身份验证插件相关联),并将结果存储在 mysql.user 系统表中的帐户行中。

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

  • IDENTIFIED WITH auth_plugin BY 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    将帐户身份验证插件设置为 auth_plugin,将明文 'auth_string' 值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表中的帐户行中。

    如果给出 REPLACE 子句,它将指定帐户的当前密码,如本节前面所述。

    如果给出 RETAIN CURRENT PASSWORD 子句,它将导致帐户的当前密码被保留为其辅助密码,如本节前面所述。

  • IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    将帐户身份验证插件设置为 auth_plugin,生成一个随机密码,将明文密码值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表中的帐户行中。该语句还在结果集中返回明文密码,以便将其提供给执行该语句的用户或应用程序。有关结果集和随机生成密码特征的详细信息,请参见随机密码生成

    如果给出 REPLACE 子句,它将指定帐户的当前密码,如本节前面所述。

    如果给出 RETAIN CURRENT PASSWORD 子句,它将导致帐户的当前密码被保留为其辅助密码,如本节前面所述。

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

    将帐户身份验证插件设置为 auth_plugin,并将 'auth_string' 值按原样存储在 mysql.user 帐户行中。如果插件需要哈希字符串,则假设该字符串已以插件所需的格式哈希处理。

  • DISCARD OLD PASSWORD

    丢弃帐户的辅助密码(如果存在),如本节前面所述。

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

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

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

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH sha2_password
             BY 'password';

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

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

除非当前用户是 jeffrey,否则前面的语句将失败,因为 REPLACE 仅允许对当前用户的密码进行更改。

示例:建立一个新的主密码,并将现有密码保留为辅助密码

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

示例:丢弃辅助密码,使帐户只保留其主密码

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

示例:指定身份验证插件,以及哈希密码值

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

有关设置密码和身份验证插件的更多信息,请参见第 8.2.14 节,“分配帐户密码”,以及第 8.2.17 节,“可插拔身份验证”

ALTER USER 多因素身份验证选项

ALTER USER 具有 ADDMODIFYDROP 子句,这些子句使能够添加、修改或删除身份验证因素。在每种情况下,该子句都会指定对一个身份验证因素执行的操作,以及可选地对另一个身份验证因素执行的操作。对于每个操作,factor 项目都会指定 FACTOR 关键字,后面加上数字 2 或 3,以指示该操作是应用于第二个还是第三个身份验证因素。(1 在这种情况下不允许。要对第一个身份验证因素采取操作,请使用ALTER USER 身份验证选项中描述的语法。)

ALTER USER 多因素身份验证子句约束由authentication_policy 系统变量定义。例如,authentication_policy 设置控制帐户可能具有的身份验证因素数量,以及对于每个因素,允许哪些身份验证方法。请参见配置多因素身份验证策略

ALTER USER 在一个语句中添加、修改或删除第二和第三个因素时,操作会按顺序执行,但如果序列中的任何操作失败,则整个 ALTER USER 语句都会失败。

对于 ADD,每个命名的因素都必须不存在,否则无法添加。对于 MODIFYDROP,每个命名的因素都必须存在才能被修改或删除。如果定义了第二个和第三个因素,则删除第二个因素会导致第三个因素成为第二个因素。

此语句删除身份验证因素 2 和 3,其效果是将帐户从 3FA 转换为 1FA

ALTER USER 'user' DROP 2 FACTOR 3 FACTOR;

有关 ADDMODIFYDROP 的更多示例,请参见多因素身份验证入门

有关确定未命名插件的身份验证子句的默认身份验证插件的因素特定规则的信息,请参见默认身份验证插件

ALTER USER 注册选项

ALTER USER 具有允许注册和取消注册 FIDO/FIDO2 设备的子句。有关更多信息,请参见使用 WebAuthn 身份验证WebAuthn 的设备取消注册,以及mysql 客户端--register-factor 选项说明。

mysql 客户端--register-factor 选项(用于 FIDO/FIDO2 设备注册)会导致 mysql 客户端生成并执行 INITIATE REGISTRATIONFINISH REGISTRATION 语句。这些语句并非旨在手动执行。

ALTER USER 角色选项

ALTER USER ... DEFAULT ROLE 定义了用户连接到服务器并进行身份验证时,或者用户在会话期间执行 SET ROLE DEFAULT 语句时,哪些角色会变得活跃。

ALTER USER ... DEFAULT ROLESET DEFAULT ROLE 的替代语法(请参见第 15.7.1.9 节,“SET DEFAULT ROLE 语句”)。但是,ALTER USER 只能为单个用户设置默认值,而 SET DEFAULT ROLE 可以为多个用户设置默认值。另一方面,您可以为 ALTER USER 语句指定 CURRENT_USER 作为用户名,而不能为 SET DEFAULT ROLE 指定。

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

每个角色名都使用第 8.2.5 节,“指定角色名”中描述的格式。例如

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

如果省略角色名的主机名部分,则默认为 '%'

DEFAULT ROLE 关键字后面的子句允许这些值

  • NONE:将默认值设置为 NONE(无角色)。

  • ALL:将默认值设置为授予该帐户的所有角色。

  • role [, role ] ...: 将默认值设置为指定的角色,这些角色在执行 ALTER USER ... DEFAULT ROLE 时必须存在并授予该帐户。

ALTER USER SSL/TLS 选项

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

要为 MySQL 帐户指定与 SSL/TLS 相关的选项,请使用 REQUIRE 子句,该子句指定一个或多个 tls_option 值。

REQUIRE 选项的顺序无关紧要,但不能重复指定任何选项。在 REQUIRE 选项之间,AND 关键字是可选的。

ALTER USER 允许以下 tls_option

  • NONE

    表示语句命名的所有帐户都没有 SSL 或 X.509 要求。如果用户名和密码有效,则允许使用未加密的连接。如果客户端具有正确的证书和密钥文件,则可以根据客户端的选择使用加密连接。

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

    客户端默认尝试建立安全连接。对于具有 REQUIRE NONE 的客户端,如果无法建立安全连接,则连接尝试将回退到未加密连接。要强制使用加密连接,客户端只需指定 --ssl-mode=REQUIRED 选项;如果无法建立安全连接,则连接尝试将失败。

  • SSL

    告诉服务器仅允许语句命名的所有帐户使用加密连接。

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

    客户端默认尝试建立安全连接。对于具有 REQUIRE SSL 的帐户,如果无法建立安全连接,则连接尝试将失败。

  • X509

    对于语句命名的所有帐户,要求客户端提供有效的证书,但确切的证书、颁发者和主体无关紧要。唯一的要求是,应该可以使用其中一个 CA 证书来验证其签名。使用 X.509 证书总是意味着加密,因此在这种情况下 SSL 选项是多余的。

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

    对于具有 REQUIRE X509 的帐户,客户端必须指定 --ssl-key--ssl-cert 选项才能连接。(建议但不强制使用 --ssl-ca,以便可以验证服务器提供的公共证书。)对于 ISSUERSUBJECT 也是如此,因为这些 REQUIRE 选项意味着 X509 的要求。

  • ISSUER 'issuer'

    对于语句命名的所有帐户,要求客户端提供由 CA 'issuer' 颁发的有效 X.509 证书。如果客户端提供的证书有效但颁发者不同,服务器将拒绝连接。使用 X.509 证书总是意味着加密,因此在这种情况下 SSL 选项是多余的。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/[email protected]';

    由于 ISSUER 意味着 X509 的要求,因此客户端必须指定 --ssl-key--ssl-cert 选项才能连接。(建议但不强制使用 --ssl-ca,以便可以验证服务器提供的公共证书。)

  • SUBJECT 'subject'

    对于语句命名的所有帐户,要求客户端提供包含主体 subject 的有效 X.509 证书。如果客户端提供的证书有效但主体不同,服务器将拒绝连接。使用 X.509 证书总是意味着加密,因此在这种情况下 SSL 选项是多余的。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/[email protected]';

    MySQL 对 'subject' 值和证书中的值进行简单的字符串比较,因此字母大小写和组件排序必须与证书中的一致。

    由于 SUBJECT 意味着 X509 的要求,因此客户端必须指定 --ssl-key--ssl-cert 选项才能连接。(建议但不强制使用 --ssl-ca,以便可以验证服务器提供的公共证书。)

  • CIPHER 'cipher'

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

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

SUBJECTISSUERCIPHER 选项可以组合在 REQUIRE 子句中

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/[email protected]'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/[email protected]'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
ALTER USER 资源限制选项

可以限制帐户对服务器资源的使用,如 第 8.2.21 节,“设置帐户资源限制” 中所述。为此,请使用 WITH 子句,该子句指定一个或多个 resource_option 值。

WITH 选项的顺序无关紧要,但如果多次指定给定的资源限制,则最后一次实例优先。

ALTER USER 允许以下 resource_option

  • MAX_QUERIES_PER_HOUR countMAX_UPDATES_PER_HOUR countMAX_CONNECTIONS_PER_HOUR count

    对于语句命名的所有帐户,这些选项限制在任何给定的一个小时内每个帐户允许对服务器进行多少次查询、更新和连接。如果 count0(默认值),则表示该帐户没有限制。

  • MAX_USER_CONNECTIONS count

    对于语句命名的所有帐户,限制每个帐户对服务器的最大同时连接数。非零 count 明确指定了帐户的限制。如果 count0(默认值),则服务器根据 max_user_connections 系统变量的全局值确定帐户的同步连接数。如果 max_user_connections 也为零,则该帐户没有限制。

示例

ALTER USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
ALTER USER 密码管理选项

ALTER USER 支持用于密码管理的几个 password_option

  • 密码过期选项:您可以手动使帐户密码过期并建立其密码过期策略。策略选项不会使密码过期。相反,它们会根据密码年龄确定服务器如何将自动过期应用于帐户,密码年龄是从最近一次帐户密码更改的日期和时间评估的。

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

  • 密码验证必备选项:您可以指示是否必须在尝试更改帐户密码时指定当前密码,作为对尝试进行更改的用户实际知道当前密码的验证。

  • 错误密码登录失败跟踪选项:您可以让服务器跟踪登录失败尝试,并暂时锁定连续输入太多错误密码的帐户。所需的失败次数和锁定时间是可配置的。

本节介绍密码管理选项的语法。有关建立密码管理策略的信息,请参阅 第 8.2.15 节,“密码管理”

如果指定了相同类型的多个密码管理选项,则最后一个选项优先。例如,PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVERPASSWORD EXPIRE NEVER 相同。

注意

除了与登录失败跟踪相关的选项外,密码管理选项仅适用于使用将凭据存储在 MySQL 内部身份验证插件的帐户。对于使用对 MySQL 外部凭据系统进行身份验证的插件的帐户,必须对该系统进行外部密码管理。有关内部凭据存储的更多信息,请参阅 第 8.2.15 节,“密码管理”

如果帐户密码被手动过期或密码年龄被认为超过了其在自动过期策略中允许的生存期,则客户端的密码将过期。在这种情况下,服务器要么断开客户端的连接,要么限制对其允许的操作(请参阅 第 8.2.16 节,“服务器处理过期密码”)。受限制的客户端执行的操作将导致错误,直到用户建立新的帐户密码。

注意

虽然可以 重置 过期的密码,方法是将其设置为当前值,但作为一项良好策略,最好选择不同的密码。DBA 可以通过建立适当的密码重用策略来强制执行不重用。请参阅 密码重用策略

ALTER USER 允许以下 password_option 值来控制密码过期

  • PASSWORD EXPIRE

    立即将语句命名的所有帐户的密码标记为过期。

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

    将语句命名的所有帐户设置为应用全局过期策略,如 default_password_lifetime 系统变量中所指定。

    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
  • PASSWORD EXPIRE NEVER

    此过期选项将覆盖语句命名的所有帐户的全局策略。对于每个帐户,它将禁用密码过期,这样密码永远不会过期。

    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
  • PASSWORD EXPIRE INTERVAL N DAY

    此过期选项将覆盖语句命名的所有帐户的全局策略。对于每个帐户,它将密码生存期设置为 N 天。以下语句要求每 180 天更改一次密码

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

ALTER USER 允许以下 password_option 值来控制基于所需最小密码更改次数的先前密码的重用

  • PASSWORD HISTORY DEFAULT

    将语句命名的所有帐户设置为应用有关密码历史长度的全局策略,以禁止在 password_history 系统变量中指定的更改次数之前重用密码。

    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
  • PASSWORD HISTORY N

    此历史长度选项将覆盖语句命名的所有帐户的全局策略。对于每个帐户,它将密码历史长度设置为 N 个密码,以禁止重用最近选择的 N 个密码中的任何一个。以下语句禁止重用以前 6 个密码中的任何一个

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

ALTER USER 允许以下 password_option 值,用于基于时间推移来控制先前密码的重用

  • PASSWORD REUSE INTERVAL DEFAULT

    将所有由帐户命名的语句设置为应用有关时间推移的全局策略,以禁止重用比 password_reuse_interval 系统变量指定的日期数更近的密码。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
  • PASSWORD REUSE INTERVAL N DAY

    此时间推移选项将覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它将密码重用间隔设置为 N 天,以禁止重用比该天数更近的密码。以下语句禁止在 360 天内重用密码

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

ALTER USER 允许以下 password_option 值,用于控制是否必须在尝试更改帐户密码时指定当前密码,作为对尝试进行更改的用户实际知道当前密码的验证

  • PASSWORD REQUIRE CURRENT

    此验证选项将覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它要求密码更改指定当前密码。

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

    此验证选项将覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它不要求密码更改指定当前密码。(可以但不一定给出当前密码。)

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
  • PASSWORD REQUIRE CURRENT DEFAULT

    将所有由帐户命名的语句设置为应用有关密码验证的全局策略,如 password_require_current 系统变量所指定的那样。

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

ALTER USER 允许以下 password_option 值,用于控制失败登录跟踪

  • FAILED_LOGIN_ATTEMPTS N

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

  • PASSWORD_LOCK_TIME {N | UNBOUNDED}

    连续多少次登录尝试提供错误密码后,锁定帐户的时间。 N 必须是 0 到 32767 之间的数字,或 UNBOUNDED。值为 0 将禁用帐户临时锁定。大于 0 的值表示锁定帐户的天数。值为 UNBOUNDED 将导致帐户锁定持续时间无限制;一旦锁定,帐户将一直处于锁定状态,直到解锁。有关解锁发生的条件的信息,请参阅 失败登录跟踪和帐户临时锁定

为了使失败登录跟踪和临时锁定生效,帐户的 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 选项都必须是非零。以下语句修改了一个帐户,使其在连续四次密码失败后保持锁定两天

ALTER USER 'jeffrey'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
ALTER USER 注释和属性选项

MySQL 9.0 支持用户注释和用户属性,如 第 15.7.1.3 节,“CREATE USER 语句” 中所述。可以使用 ALTER USER 通过 COMMENTATTRIBUTE 选项分别修改这些选项。您不能在同一个 ALTER USER 语句中指定这两个选项;尝试这样做会导致语法错误。

用户注释和用户属性存储在 Information Schema USER_ATTRIBUTES 表中,作为一个 JSON 对象;用户注释作为该表 ATTRIBUTE 列中 comment 键的值存储,如本文稍后讨论的那样。 COMMENT 文本可以是任何任意的带引号的文本,并且将替换任何现有的用户注释。 ATTRIBUTE 值必须是 JSON 对象的有效字符串表示形式。这将与任何现有的用户属性合并,就好像对现有用户属性和新属性使用了 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 null(必须是小写且不带引号),如下所示

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)

要将现有用户注释设置为一个空字符串,请使用 ALTER USER ... COMMENT ''。这将在 USER_ATTRIBUTES 表中留下一个空的 comment 值;要完全删除用户注释,请使用 ALTER USER ... ATTRIBUTE ...,并将列键的值设置为 JSON null(不带引号,小写)。以下一系列 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)
ALTER USER 帐户锁定选项

MySQL 支持使用 ACCOUNT LOCKACCOUNT UNLOCK 选项锁定和解锁帐户,这些选项指定帐户的锁定状态。有关更多讨论,请参阅 第 8.2.20 节,“帐户锁定”

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

ALTER USER ... ACCOUNT UNLOCK 将解锁语句中命名的任何由于登录失败次数过多而被临时锁定的帐户。请参阅 第 8.2.15 节,“密码管理”

ALTER USER 二进制日志记录

ALTER USER 如果成功,则会写入二进制日志,但如果失败,则不会写入;在这种情况下,将发生回滚,并且不会进行任何更改。写入二进制日志的语句将包含所有命名的用户。如果给出了 IF EXISTS 子句,则即使是那些不存在且未被更改的用户也将包含在内。

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

  • 原始语句中命名的插件(如果指定了)。

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

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

如果原始语句指定了 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 选项,则写入二进制日志的语句将包含该选项。

ALTER USER 语句中包含支持多因素身份验证 (MFA) 的子句的语句将写入二进制日志,但 ALTER USER user factor INITIATE REGISTRATION 语句除外。

  • ALTER USER user factor FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'auth_string' 语句将写入二进制日志,如 ALTER USER user MODIFY factor IDENTIFIED WITH authentication_webauthn AS webauthn_hash_string

  • 在复制上下文中,复制用户需要 PASSWORDLESS_USER_ADMIN 权限才能对使用 authentication_webauthn 插件配置为无密码身份验证的帐户执行 ALTER USER ... MODIFY 操作。