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.1.1 更改用户语句

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、资源限制、密码管理、注释和属性可以被修改existing账户。它也可以用来锁定和解锁账户。

大多数情况下,ALTER USER 需要全局CREATE USER 权限,或者UPDATE 权限对 mysql 系统架构。除非:

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

    SELECT CURRENT_USER();
  • 对于 DEFAULT ROLE 语法,ALTER USER 需要这些权限:

    • 为其他用户设置默认角色需要全局CREATE USER 权限,或者UPDATE 权限对 mysql.default_roles 系统表。

    • 为自己设置默认角色不需要特殊权限,只要你想要的默认角色已经被授予给你。

  • 修改次要密码所需的权限:

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

这些额外的权限考虑也适用:

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

Important

在某些情况下,ALTER USER 可能会被记录到服务器日志或客户端的历史文件,如~/.mysql_history,这意味着明文密码可能被读取由该信息的读取权限为读取的任何人。关于服务器日志的条件和控制方法,请查看第8.1.2.3节,“密码和日志记录”。关于客户端日志记录,查看第6.5.1.3节,“mysql 客户端日志记录”

有多个方面是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子句。)

ALTER USER 语句中,auth_option 值可以在 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_new_password'设置为jeffrey的密码。对于jeanne,没有单独账户值,因此密码保持不变。对于joshIDENTIFIED BY设置了新密码('josh_new_password'),并且指定了REPLACE以验证执行ALTER USER语句的用户知道当前密码('josh_current_password'),并且将当前密码保留为账户次要密码。因此,josh可以使用主或次要密码连接。

剩余的属性对所有在语句中指定的账户都有效,因此对于两个账户:

  • 必须使用SSL连接。

  • 账户最多可以同时建立两个连接。

  • 密码不能重用最近五个密码中的任何一个。

示例:将josh的次要密码丢弃,仅保留主密码:

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

在缺少某种类型选项时,账户保持不变。例如,在没有锁定选项的情况下,账户的锁定状态不变。

账户名可能后跟一个auth_option认证选项,指定账户认证插件、凭证或两者。它也可以包括当前密码的更换子句,以及管理账户是否有副本密码的子句。

Note

随机密码生成、密码验证和副本密码的子句只适用于使用 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 mysql_native_password
             BY 'password';

示例:像前一个示例一样,但是在加上当前密码的明文值,以满足任何账户要求用户知道该密码:

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

前面的语句失败,因为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 mysql_native_password
             AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';

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

ALTER USER 多因素认证 Options

ALTER USER 语句中有ADDMODIFYDROP子句,用于添加、修改或删除身份验证因素。在每个操作中,子句指定要执行的操作,并可选地指定对另一个身份验证因素的操作。对于每个操作,factor项目指定了以数字2或3开头的FACTOR关键字,表示该操作是否应用于第二或第三个身份验证因素。(1不允许在这个上下文中使用。要对第一个身份验证因素进行操作,请见ALTER USER 身份验证 Options。)

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 中有注册和注销 FIDO/FIDO2 设备的子句。更多信息,见,和mysql 客户端--register-factor 选项描述。

命令行客户端mysql--register-factor 选项,用于 FIDO/FIDO2 设备注册,导致命令行客户端生成并执行 INITIATE REGISTRATIONFINISH REGISTRATION 语句。这些语句不适合手动执行。

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 执行时授予该账户。

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

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

REQUIRE 选项的顺序不重要,但不能指定同一个选项两次。AND 关键字在 REQUIRE 选项之间是可选的。

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证书验证其签名。在这种情况下,总是隐含加密,所以不需要SSL选项。

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

    对于具有REQUIRE X509的账户,客户端必须指定--ssl-key--ssl-cert选项以连接。同时,推荐指定--ssl-ca以验证服务器提供的公钥证书。这也同样适用于ISSUERSUBJECT,因为它们隐含了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/emailAddress=ca@example.com';

    因为ISSUER隐含了X509的要求,客户端必须指定--ssl-key--ssl-cert选项以连接。同时,推荐指定--ssl-ca以验证服务器提供的公钥证书。

  • SUBJECT 'subject'

    对所有由语句命名的账户,要求客户端提供有效的X.509证书,其中包含主题subject。客户端如果提供了有效的证书,但主题不同,服务器将拒绝连接。在这种情况下,总是隐含加密,所以不需要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 对 '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/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';

可以对服务器资源的使用进行限制,详见第8.2.21节,“设置帐户资源限制”。要实现此功能,请使用指定一个或多个resource_option值的WITH子句。

WITH选项的顺序无关紧要,除非给定的资源限制被指定多次,那么最后一个实例优先生效。

ALTER USER 允许这些resource_option值:

  • 每小时查询次数 count, 每小时更新次数 count, 每小时连接次数 count

    对所有名为该语句的帐户,这些选项限制了每个帐户在任何给定的一个小时内可以执行的查询、更新和连接数目。如果count0(默认值),那么对该帐户没有限制。

  • 用户最大连接数 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 支持多种password_option值来管理密码:

  • 密码过期选项:可以手动过期账户密码,并建立其密码过期策略。策略选项不会过期密码,而是根据最近一次账户密码变更的日期和时间来确定服务器自动过期账户的方式。

  • 密码重用选项:可以限制密码重用基于密码变化次数、时间间隔或两者。

  • 密码验证要求选项:可以指示尝试更改账户密码必须指定当前密码,以验证用户尝试更改实际知道当前密码的用户。

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

本节描述了密码管理选项的语法。关于密码管理策略,请见第8.2.15节,“密码管理”

指定同一类型的多个密码管理选项,最后一个优先生效。例如,PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVER 等于 PASSWORD EXPIRE NEVER

Note

除了失败登录追踪相关的选项外,密码管理选项只对使用 MySQL 内部存储凭证的账户生效。使用外部凭证系统进行身份验证的账户,密码管理必须在该系统中处理。关于内部凭证存储,请见第8.2.15节,“密码管理”

如果客户端的账户密码已过期(手动或自动),服务器将断开连接或限制其操作(见第8.2.16节,“服务器处理过期密码”)。受限制的客户端执行操作将导致错误,直到用户重新设置账户密码。

Note

虽然可以通过将密码设置为当前值来““重置”过期的密码,但从安全角度来说,选择不同的密码更好。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;
  • 密码重用间隔 N

    这个时间间隔选项覆盖所有由语句命名的账户,设置每个账户的密码重用间隔为 N 天,以禁止更新的密码重用。以下语句禁止密码重用 360 天:

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

ALTER USER 允许这些 密码选项 值来控制是否必须指定当前密码,以验证尝试更改账户密码的用户实际知道当前密码:

  • 密码需要当前

    这个验证选项覆盖所有由语句命名的账户。对于每个账户,它要求密码更改指定当前密码。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
  • 密码需要当前可选

    这个验证选项覆盖所有由语句命名的账户。对于每个账户,不要求密码更改指定当前密码(当前密码可能不需要指定)。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
  • 密码需要当前默认

    将所有语句命名的账户设置为,按照 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;

MySQL 8.4 支持用户注释和用户属性,详见第15.7.1.3节,“CREATE USER 语句”。这些可以使用ALTER USER语句中的COMMENTATTRIBUTE选项来修改;不能在同一个ALTER USER语句中指定两个选项,否则会出现语法错误。

用户注释和用户属性存储在信息架构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)

MySQL 支持使用ACCOUNT LOCKACCOUNT UNLOCK选项来锁定或解锁账户,指定账户的锁定状态。更多信息请见第8.2.20节,“账户锁定”

如果指定了多个账户锁定选项,最后一个将生效。

ALTER USER ... ACCOUNT UNLOCK解锁因登录失败次数过多而临时锁定的账户。见第8.2.15节,“密码管理”

ALTER USER 如果成功,写入二进制日志,但如果失败,则回滚并且不做任何修改。写入二进制日志的语句包括所有指定的用户。如果给定了IF EXISTS子句,这还包括不存在或未被修改的用户。

如果原始语句对用户进行身份验证,写入二进制日志的语句指定该用户适用的身份验证插件,以以下方式确定:

  • 原始语句中指定的插件,如果有指定。

  • 否则,如果用户存在,使用关联的账户插件;如果用户不存在,使用默认身份验证插件。如果写入二进制日志的语句必须为某个用户指定身份验证插件,请在原始语句中包含它。

如果服务器在写入二进制日志时添加了默认身份验证插件,对于那些用户,会将其名称写入错误日志。

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

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

  • ALTER USER 用户名称 FINISH REGISTRATION SET CHALLENGE_RESPONSE AS '认证字符串' 语句将被写入到二进制日志中,如ALTER USER 用户名称 MODIFY 因子 IDENTIFIED WITH authentication_webauthn AS webauthn_hash_string;

  • 在复制环境中,使用PASSWORDLESS_USER_ADMIN特权的复制用户可以执行使用authentication_webauthn插件配置的无密码认证账户的ALTER USER ... MODIFY操作。