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 PASSWORD
或DISCARD OLD PASSWORD
子句所必需的。之所以需要该权限来操作您自己的辅助密码,是因为大多数用户只需要一个密码。如果要允许某个帐户操作所有帐户的辅助密码,则该帐户需要
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
权限。
当启用 read_only
系统变量时,ALTER USER
还需要 CONNECTION_ADMIN
权限(或已弃用的 SUPER
权限)。
以下额外权限注意事项也适用
authentication_policy
系统变量对如何使用ALTER USER
语句的身份验证相关子句施加了某些限制;有关详细信息,请参阅该变量的说明。如果您拥有AUTHENTICATION_POLICY_ADMIN
权限,则这些限制不适用。要修改使用无密码身份验证的帐户,您必须拥有
PASSWORDLESS_USER_ADMIN
权限。
默认情况下,如果您尝试修改不存在的用户,则会发生错误。如果给定了 IF EXISTS
子句,则该语句将为每个不存在的命名用户生成警告,而不是错误。
在某些情况下,ALTER USER
可能会记录在服务器日志中或客户端的历史文件中(例如 ~/.mysql_history
),这意味着任何有权读取该信息的人都可以读取明文密码。有关服务器日志中发生这种情况的条件以及如何控制它的信息,请参阅 第 8.1.2.3 节“密码和日志记录”。有关客户端日志记录的类似信息,请参阅 第 6.5.1.3 节“mysql 客户端日志记录”。
ALTER USER
语句涉及多个方面,将在以下主题中进行描述
对于每个受影响的帐户,ALTER USER
会修改 mysql.user
系统表中的相应行,以反映语句中指定的属性。未指定的属性将保留其当前值。
每个帐户名称都使用 第 8.2.4 节“指定帐户名称” 中描述的格式。帐户名称的主机名部分(如果省略)默认为 '%'
。也可以指定 CURRENT_USER
或 CURRENT_USER()
来引用与当前会话关联的帐户。
只有一种情况下,可以使用 USER()
函数指定帐户
ALTER USER USER() IDENTIFIED BY 'auth_string';
此语法允许您在不直接命名帐户的情况下更改自己的密码。(该语法还支持 ALTER USER 身份验证选项 中描述的 REPLACE
、RETAIN CURRENT PASSWORD
和 DISCARD OLD PASSWORD
子句。)
对于允许在 user
值后跟 auth_option
值的 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
,没有按帐户设置的值(因此密码保持不变)。对于 josh
,IDENTIFIED BY
建立了一个新密码('
),指定了 josh_new_password
'REPLACE
以验证发出 ALTER USER
语句的用户是否知道当前密码('
),并且该当前密码也被保留为帐户的辅助密码。(因此,josh_current_password
'josh
可以使用主密码或辅助密码连接。)
其余属性全局应用于语句中命名的所有帐户,因此对于这两个帐户
连接需要使用 SSL。
该帐户最多可用于两个并发连接。
密码更改不能重复使用最近五个密码中的任何一个。
示例:丢弃 josh
的辅助密码,使该帐户只剩下其主密码
ALTER USER 'josh'@'localhost' DISCARD OLD PASSWORD;
在没有特定类型选项的情况下,帐户在该方面保持不变。例如,如果没有锁定选项,则帐户的锁定状态不会更改。
帐户名称后面可以跟一个 auth_option
身份验证选项,该选项指定帐户身份验证插件、凭据或两者。它还可以包含一个密码验证子句,用于指定要替换的帐户当前密码,以及管理帐户是否具有辅助密码的子句。
随机密码生成、密码验证和辅助密码的子句仅适用于使用将凭据存储在 MySQL 内部身份验证插件的帐户。对于使用针对 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
表中。如果插件需要哈希值,则该值必须已经以适合该插件的格式进行哈希处理;否则,该插件将无法使用该值,并且不会发生正确的客户端连接身份验证。哈希字符串可以是字符串文字或十六进制值。后者对应于在启用
print_identified_with_as_hex
系统变量时,SHOW CREATE USER
为包含不可打印字符的密码哈希显示的值类型。如果身份验证插件不对身份验证字符串执行哈希处理,则
BY '
和auth_string
'AS '
子句具有相同的效果:身份验证字符串按原样存储在auth_string
'mysql.user
系统表中。
REPLACE '
子句执行密码验证。如果给出current_auth_string
'REPLACE
以明文(未加密)字符串的形式指定要替换的帐户当前密码。如果帐户的密码更改需要指定当前密码,则必须给出该子句,以验证尝试进行更改的用户是否确实知道当前密码。
如果帐户的密码更改可能需要也可能不需要指定当前密码,则该子句是可选的。
如果给出了该子句但与当前密码不匹配,则该语句将失败,即使该子句是可选的。
仅当为当前用户更改帐户密码时,才能指定
REPLACE
。
有关通过指定当前密码来验证密码的更多信息,请参见 第 8.2.15 节,“密码管理”。
RETAIN CURRENT PASSWORD
和DISCARD 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';
除非当前用户是 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 mysql_native_password
AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
有关设置密码和身份验证插件的其他信息,请参见 第 8.2.14 节,“分配帐户密码” 和 第 8.2.17 节,“可插拔身份验证”。
ALTER USER
具有 ADD
、MODIFY
和 DROP
子句,可以添加、修改或删除身份验证因素。在每种情况下,该子句都指定要对一个身份验证因素执行的操作,以及可选地对另一个身份验证因素执行的操作。对于每个操作,factor
项指定 FACTOR
关键字,前面是数字 2 或 3,以指示该操作是应用于第二个还是第三个身份验证因素。(在此上下文中不允许使用 1。要对第一个身份验证因素执行操作,请使用 ALTER USER 身份验证选项 中描述的语法。)
ALTER USER
多因素身份验证子句约束由 authentication_policy
系统变量定义。例如,authentication_policy
设置控制帐户可能具有的身份验证因素的数量,以及每个因素允许使用哪些身份验证方法。请参见 配置多因素身份验证策略。
当 ALTER USER
在单个语句中添加、修改或删除第二个和第三个因素时,操作将按顺序执行,但如果序列中的任何操作失败,则整个 ALTER USER
语句都将失败。
对于 ADD
,每个命名的因素都必须不存在,否则无法添加。对于 MODIFY
和 DROP
,每个命名的因素都必须存在才能进行修改或删除。如果定义了第二个和第三个因素,则删除第二个因素会导致第三个因素取代其成为第二个因素。
此语句删除身份验证因素 2 和 3,这会将帐户从 3FA 转换为 1FA
ALTER USER 'user' DROP 2 FACTOR 3 FACTOR;
有关 ADD
、MODIFY
和 DROP
的更多示例,请参见 多因素身份验证入门。
有关确定未命名插件的身份验证子句的默认身份验证插件的特定于因素的规则的信息,请参见 默认身份验证插件。
ALTER USER
具有启用注册和取消注册 FIDO/FIDO2 设备的子句。有关更多信息,请参见 使用 WebAuthn 身份验证、WebAuthn 的设备取消注册 以及 mysql 客户端 --register-factor
选项描述。
mysql 客户端 --register-factor
选项用于 FIDO/FIDO2 设备注册,它会导致 mysql 客户端生成并执行 INITIATE REGISTRATION
和 FINISH REGISTRATION
语句。这些语句不适用于手动执行。
ALTER USER ... DEFAULT ROLE
定义当用户连接到服务器并进行身份验证时,或者当用户在会话期间执行 SET ROLE DEFAULT
语句时,哪些角色将变为活动状态。
ALTER USER ... DEFAULT ROLE
是 SET DEFAULT ROLE
的替代语法(请参见 第 15.7.1.9 节,“SET DEFAULT ROLE 语句”)。但是,ALTER USER
只能为单个用户设置默认值,而 SET DEFAULT ROLE
可以为多个用户设置默认值。另一方面,您可以将 CURRENT_USER
指定为 ALTER 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
选项的顺序无关紧要,但任何选项都不能指定两次。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
,以便可以验证服务器提供的公共证书。)对于ISSUER
和SUBJECT
也是如此,因为那些REQUIRE
选项隐含了X509
的要求。ISSUER '
issuer
'对于语句命名的所有帐户,要求客户端提供由 CA
'
颁发的有效 X.509 证书。如果客户端提供的证书有效但颁发者不同,则服务器将拒绝连接。使用 X.509 证书始终意味着加密,因此在这种情况下不需要issuer
'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';
SUBJECT
、ISSUER
和 CIPHER
选项可以在 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';
可以对帐户使用服务器资源设置限制,如第 8.2.21 节“设置帐户资源限制” 中所述。为此,请使用指定一个或多个 resource_option
值的 WITH
子句。
WITH
选项的顺序无关紧要,除非多次指定了给定的资源限制,在这种情况下,最后一个实例优先。
ALTER USER
允许以下 resource_option
值
MAX_QUERIES_PER_HOUR
、count
MAX_UPDATES_PER_HOUR
、count
MAX_CONNECTIONS_PER_HOUR
count
对于语句命名的所有帐户,这些选项限制在任何给定的一个小时内每个帐户允许的查询、更新和到服务器的连接数量。如果
count
为0
(默认值),则表示该帐户没有限制。MAX_USER_CONNECTIONS
count
对于语句命名的所有帐户,限制每个帐户同时连接到服务器的最大数量。非零
count
显式指定帐户的限制。如果count
为0
(默认值),则服务器根据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
相同。
除与登录失败跟踪相关的选项外,密码管理选项仅适用于使用将凭据内部存储到 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_ATTEMPTS
和 PASSWORD_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
分别通过 COMMENT
和 ATTRIBUTE
选项修改这些内容。 不能在同一个 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 LOCK
和 ACCOUNT UNLOCK
选项进行帐户锁定和解锁,这些选项指定帐户的锁定状态。 有关其他讨论,请参阅 第 8.2.20 节 “帐户锁定”。
如果指定了多个帐户锁定选项,则最后一个选项优先。
ALTER USER ... ACCOUNT UNLOCK
解锁由于登录失败次数过多而被临时锁定的语句命名的任何帐户。 请参阅 第 8.2.15 节 “密码管理”。
如果 ALTER USER
成功,则将其写入二进制日志;如果失败,则不会写入;在这种情况下,将发生回滚,并且不会进行任何更改。 写入二进制日志的语句包括所有命名的用户。 如果给出了 IF EXISTS
子句,则即使是不存在且未被更改的用户也包括在内。
如果原始语句更改了用户的凭据,则写入二进制日志的语句将指定该用户的适用身份验证插件,确定方式如下:
如果指定了插件,则为原始语句中命名的插件。
否则,如果用户存在,则为与用户帐户关联的插件;如果用户不存在,则为默认身份验证插件。 (如果写入二进制日志的语句必须为用户指定特定的身份验证插件,请将其包含在原始语句中。)
如果服务器在写入二进制日志的语句中为任何用户添加了默认身份验证插件,则它会向错误日志写入一条警告,其中列出了这些用户。
如果原始语句指定了 FAILED_LOGIN_ATTEMPTS
或 PASSWORD_LOCK_TIME
选项,则写入二进制日志的语句将包含该选项。
包含支持多因素身份验证 (MFA) 的子句的 ALTER USER
语句将被写入二进制日志,但 ALTER USER
语句除外。user factor
INITIATE REGISTRATION
ALTER USER
语句将被写入二进制日志,格式为user factor
FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'auth_string
'ALTER USER
;user
MODIFYfactor
IDENTIFIED WITH authentication_webauthn ASwebauthn_hash_string
在复制上下文中,复制用户需要
PASSWORDLESS_USER_ADMIN
权限才能对使用authentication_webauthn
插件配置为无密码身份验证的帐户执行ALTER USER ... MODIFY
操作。