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
系统表。 -
为自己设置默认角色不需要特殊权限,只要你想要的默认角色已经被授予给你。
-
-
修改次要密码所需的权限:
-
使用
APPLICATION_PASSWORD_ADMIN
privilege来使用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
子句。)
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
,没有单独账户值,因此密码保持不变。对于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 内部存储凭证的认证插件对应的账户。对于使用外部凭证系统进行认证的插件,密码管理必须在该系统中处理。关于内部凭证存储的更多信息,请参见第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 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';
前面的语句失败,因为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
语句中有ADD
、MODIFY
和DROP
子句,用于添加、修改或删除身份验证因素。在每个操作中,子句指定要执行的操作,并可选地指定对另一个身份验证因素的操作。对于每个操作,factor
项目指定了以数字2或3开头的FACTOR关键字,表示该操作是否应用于第二或第三个身份验证因素。(1不允许在这个上下文中使用。要对第一个身份验证因素进行操作,请见ALTER USER 身份验证 Options。)
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;
关于因子特定的规则,用于确定未指定插件的身份验证子句的默认身份验证插件,请见默认身份验证插件.
ALTER USER
中有注册和注销 FIDO/FIDO2 设备的子句。更多信息,见、,和mysql 客户端--register-factor
选项描述。
命令行客户端mysql 的 --register-factor
选项,用于 FIDO/FIDO2 设备注册,导致命令行客户端生成并执行 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
可以为多个用户设置默认值。反之,你可以在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
:将默认设置为账户授予的所有角色。 -
: 将指定的角色设置为默认值,这些角色必须存在且在ALTER USER ... DEFAULT ROLE 执行时授予该账户。role
[,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
以验证服务器提供的公钥证书。这也同样适用于ISSUER
和SUBJECT
,因为它们隐含了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/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';
SUBJECT
、ISSUER
和 CIPHER
选项可以在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
对所有名为该语句的帐户,这些选项限制了每个帐户在任何给定的一个小时内可以执行的查询、更新和连接数目。如果
count
是0
(默认值),那么对该帐户没有限制。 -
用户最大连接数
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 内部存储凭证的账户生效。使用外部凭证系统进行身份验证的账户,密码管理必须在该系统中处理。关于内部凭证存储,请见第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;
-
密码重用间隔
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_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
选项,写入二进制日志的语句包括该选项。
ALTER USER
语句,支持多因素身份验证(MFA)的子句除去ALTER USER
语句外,写入二进制日志。user factor
INITIATE REGISTRATION
-
ALTER USER
语句将被写入到二进制日志中,如用户名称
FINISH REGISTRATION SET CHALLENGE_RESPONSE AS '认证字符串
'ALTER USER
;用户名称
MODIFY因子
IDENTIFIED WITH authentication_webauthn ASwebauthn_hash_string
-
在复制环境中,使用
PASSWORDLESS_USER_ADMIN
特权的复制用户可以执行使用authentication_webauthn
插件配置的无密码认证账户的ALTER USER ... MODIFY
操作。