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
语句修改 MySQL 帐户。它支持为现有帐户修改身份验证、角色、SSL/TLS、资源限制、密码管理、注释和属性属性。它还可用于锁定和解锁帐户。
在大多数情况下,ALTER USER
需要全局CREATE USER
权限或系统架构的UPDATE
权限。mysql
例外情况是:
任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。(特别是,您可以更改自己的密码。)要查看服务器将您验证为哪个帐户,请调用该
CURRENT_USER()
函数:SELECT CURRENT_USER();
对于
DEFAULT ROLE
语法,ALTER USER
需要这些特权:为另一个用户设置默认角色需要全局
CREATE USER
权限或 系统表UPDATE
权限。mysql.default_roles
为您自己设置默认角色不需要特殊权限,只要您希望作为默认角色的角色已被授予您即可。
修改辅助密码的语句需要这些权限:
APPLICATION_PASSWORD_ADMIN
需要权限才能将 orRETAIN CURRENT PASSWORD
子句DISCARD OLD PASSWORD
用于ALTER USER
适用于您自己帐户的语句。由于大多数用户只需要一个密码,因此需要该权限来操作您自己的二级密码。如果允许一个帐户操作所有帐户的辅助密码,则它需要
CREATE USER
权限而不是APPLICATION_PASSWORD_ADMIN
.
read_only
启用系统变量
时,ALTER USER
还需要
CONNECTION_ADMIN
权限(或已弃用的SUPER
权限)。
从 MySQL 8.0.27 开始,这些额外的权限注意事项适用:
系统
authentication_policy
变量对如何使用与身份验证相关的语句子句施加了某些限制ALTER USER
;有关详细信息,请参阅该变量的说明。AUTHENTICATION_POLICY_ADMIN
如果您有权限, 则这些限制不适用 。要修改使用无密码身份验证的帐户,您必须具有
PASSWORDLESS_USER_ADMIN
权限。
默认情况下,如果您尝试修改不存在的用户,则会发生错误。如果IF EXISTS
给出该子句,该语句会为每个不存在的指定用户生成警告,而不是错误。
在某些情况下,ALTER
USER
可能会记录在服务器日志中或在客户端的历史文件中,例如
~/.mysql_history
,这意味着任何对该信息具有读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅
第 4.5.1.3 节,“mysql 客户端日志记录”。
该声明有几个方面ALTER
USER
,在以下主题下进行了描述:
对于每个受影响的帐户,ALTER
USER
修改系统表中的相应行
mysql.user
以反映语句中指定的属性。未指定的属性保留其当前值。
每个帐户名都使用
第 6.2.4 节“指定帐户名”中描述的格式。帐户名的主机名部分(如果省略)默认为'%'
. 也可以指定
CURRENT_USER
或
CURRENT_USER()
引用与当前会话关联的帐户。
仅对于一种语法,可以使用以下
USER()
函数指定帐户:
ALTER USER USER() IDENTIFIED BY 'auth_string';
此语法允许更改您自己的密码,而无需按字面意思命名您的帐户。(该语法还支持
在ALTER USER Authentication OptionsREPLACE
中描述的、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 天选择一个新密码,并启用登录失败跟踪,例如连续 3 次错误密码导致帐户临时锁定两天:
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;
以下IDENTIFIED BY
值
jeffrey
仅适用于紧接其前的帐户,因此它将密码更改为
仅适用于。对于
,没有每个帐户的值(因此保持密码不变)。对于,
建立新密码(),
指定验证发出该
语句的用户是否知道当前密码(),并且当前密码也保留为帐户二级密码。(因此,可以使用主密码或辅助密码进行连接。)
'
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 内部存储凭据的身份验证插件的帐户。对于使用针对 MySQL 外部的凭证系统执行身份验证的插件的帐户,密码管理也必须针对该系统在外部进行处理。有关内部凭证存储的更多信息,请参阅 第 6.2.15 节,“密码管理”。
auth_plugin
命名身份验证插件。插件名称可以是带引号的字符串文字或不带引号的名称。插件名称存储在系统表 的plugin
列中 。mysql.user
对于
auth_option
未指定身份验证插件的语法,服务器分配默认插件,如 默认身份验证插件中所述确定。有关每个插件的说明,请参阅 第 6.4.1 节,“身份验证插件”。内部存储的凭据存储在
mysql.user
系统表中。一个 值或指定帐户凭据,可以是明文(未加密)字符串,也可以是与帐户关联的身份验证插件所期望的格式的哈希值,分别为:'
auth_string
'RANDOM PASSWORD
对于使用的语法,字符串是明文并传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在 表中。插件可以使用指定的值,在这种情况下不会发生散列。
BY '
auth_string
'mysql.user
对于使用 的语法
BY RANDOM PASSWORD
,MySQL 会生成一个随机密码并作为明文并将其传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在mysql.user
表中。插件可以使用指定的值,在这种情况下不会发生散列。随机生成的密码从 MySQL 8.0.18 开始可用,并具有 随机密码生成中描述的特征。
对于使用的语法,假定字符串已经采用身份验证插件所需的格式,并按原样存储在表中。如果插件需要散列值,则该值必须已经以适合插件的格式散列;否则,插件无法使用该值,并且不会发生客户端连接的正确身份验证。
AS '
auth_string
'mysql.user
从 MySQL 8.0.17 开始,散列字符串可以是字符串文字或十六进制值。后者对应于 启用系统变量
SHOW CREATE USER
时包含不可打印字符的密码哈希 显示的值类型。print_identified_with_as_hex
如果身份验证插件不对身份验证字符串执行散列,则和 子句具有相同的效果:身份验证字符串按原样存储在 系统表中。
BY '
auth_string
'AS '
auth_string
'mysql.user
该 子句执行密码验证,从 MySQL 8.0.13 开始可用。如果给出:
REPLACE '
current_auth_string
'REPLACE
指定要替换的帐户当前密码,作为明文(未加密)字符串。如果需要更改密码以指定当前密码,则必须给出该子句,以验证尝试进行更改的用户实际上知道当前密码。
如果帐户的密码更改可能但不需要指定当前密码,则该子句是可选的。
如果给出了子句但与当前密码不匹配,即使该子句是可选的,该语句也会失败。
REPLACE
只有在更改当前用户的帐户密码时才能指定。
有关通过指定当前密码进行密码验证的更多信息,请参阅 第 6.2.15 节,“密码管理”。
RETAIN CURRENT PASSWORD
andDISCARD OLD PASSWORD
子句实现双密码功能,从 MySQL 8.0.14 开始可用 。两者都是可选的,但如果给出,将产生以下效果:RETAIN CURRENT PASSWORD
保留帐户当前密码作为其辅助密码,替换任何现有的辅助密码。新密码成为主密码,但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。(例外:如果语句指定的新密码ALTER USER
为空,则即使RETAIN CURRENT PASSWORD
给出二级密码也为空。)如果您
RETAIN CURRENT PASSWORD
为主密码为空的帐户指定,该语句将失败。如果一个帐户有一个二级密码,而您在没有指定的情况下更改了它的主密码
RETAIN CURRENT PASSWORD
,则二级密码将保持不变。如果您更改分配给该帐户的身份验证插件,则二级密码将被丢弃。如果您更改身份验证插件并指定
RETAIN CURRENT PASSWORD
,则语句失败。DISCARD OLD PASSWORD
丢弃二级密码(如果存在)。该帐户只保留其主密码,客户端只能使用主密码使用该帐户连接到服务器。
有关使用双重密码的更多信息,请参阅 第 6.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';
有关设置密码和身份验证插件的其他信息,请参阅 第 6.2.14 节,“分配帐户密码”和 第 6.2.17 节,“可插入身份验证”。
从 MySQL 8.0.27 开始,ALTER USER
有ADD
、MODIFY
和
DROP
子句可以添加、修改或删除身份验证因素。在每种情况下,该子句都指定了对一个身份验证因素执行的操作,以及可选的对另一个身份验证因素的操作。对于每个操作,该
factor
项目指定
FACTOR
前面带有数字 2 或 3 的关键字,以指示该操作是适用于第二个还是第三个身份验证因素。(在此上下文中不允许使用 1。要对第一个身份验证因素采取行动,请使用
ALTER USER Authentication 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;
有关其他ADD
、
MODIFY
和DROP
示例,请参阅
多因素身份验证入门。
有关确定未命名插件的身份验证子句的默认身份验证插件的特定因素规则的信息,请参阅 默认身份验证插件。
从 MySQL 8.0.27 开始,ALTER USER
具有使 FIDO 设备能够注册和注销的子句。有关详细信息,请参阅
使用 FIDO 身份验证、
FIDO 设备注销和mysql客户端
--fido-register-factor
选项说明。
mysql客户端
选项
,--fido-register-factor
用于 FIDO 设备注册,使
mysql客户端生成并执行
INITIATE REGISTRATION
andFINISH
REGISTRATION
语句。这些语句不适用于手动执行。
ALTER USER ...
DEFAULT ROLE
定义当用户连接到服务器并进行身份验证时,或者当用户
SET ROLE
DEFAULT
在会话期间执行语句时,哪些角色会变为活动状态。
ALTER USER ...
DEFAULT ROLE
是替代语法
SET DEFAULT ROLE
(参见
第 13.7.1.9 节,“SET DEFAULT ROLE 语句”)。但是,
ALTER USER
只能为单个用户设置默认值,而SET
DEFAULT ROLE
可以为多个用户设置默认值。另一方面,您可以
CURRENT_USER
为语句指定 as 用户名
ALTER USER
,而不能为SET DEFAULT
ROLE
.
每个用户帐户名都使用前面描述的格式。
每个角色名称都使用第 6.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 的背景信息,请参阅第 6.3 节,“使用加密连接”。
要为 MySQL 帐户指定与 SSL/TLS 相关的选项,请使用
REQUIRE
指定一个或多个
tls_option
值的子句。
选项的顺序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 证书来验证其签名。使用 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/emailAddress=ca@example.com';
因为
ISSUER
隐含了 的要求X509
,客户端必须指定--ssl-key
和--ssl-cert
选项才能连接。(建议但不要求--ssl-ca
也指定,以便验证服务器提供的公共证书。)SUBJECT '
subject
'对于语句命名的所有帐户,要求客户端出示包含 subject 的有效 X.509 证书
subject
。如果客户端提供的证书有效但主题不同,则服务器会拒绝连接。使用 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 对值与证书中的值进行简单的字符串比较 ,因此字母大小写和组件顺序必须与证书中的完全一致。
'
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';
可以限制帐户对服务器资源的使用,如第 6.2.21 节“设置帐户资源限制”中所述。为此,请使用WITH
指定一个或多个resource_option
值的子句。
选项的顺序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
密码管理的多个值:
密码过期选项:您可以手动使帐户密码过期并建立其密码过期策略。策略选项不会使密码过期。相反,他们确定服务器如何根据密码使用期限对帐户应用自动过期,密码使用期限是从最近一次帐户密码更改的日期和时间开始评估的。
密码重用选项:您可以根据密码更改次数、经过的时间或两者来限制密码重用。
需要密码验证的选项:您可以指示更改帐户密码的尝试是否必须指定当前密码,以验证尝试进行更改的用户实际上知道当前密码。
密码错误登录失败跟踪选项:您可以使服务器跟踪失败的登录尝试,并临时锁定连续输入错误密码过多的帐户。所需的故障次数和锁定时间是可配置的。
本节介绍密码管理选项的语法。有关建立密码管理策略的信息,请参阅 第 6.2.15 节,“密码管理”。
如果指定了多个给定类型的密码管理选项,则最后一个优先。例如,
PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE
NEVER
与 相同PASSWORD EXPIRE
NEVER
。
除了与失败登录跟踪相关的选项外,密码管理选项仅适用于使用身份验证插件的帐户,该插件在 MySQL 内部存储凭据。对于使用针对 MySQL 外部的凭证系统执行身份验证的插件的帐户,密码管理也必须针对该系统在外部进行处理。有关内部凭证存储的更多信息,请参阅 第 6.2.15 节,“密码管理”。
如果帐户密码已手动过期,或者根据自动过期策略,密码期限被认为大于其允许的生命周期,则客户端的密码已过期。在这种情况下,服务器要么断开客户端,要么限制允许的操作(请参阅 第 6.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
passwords,以禁止重复使用任何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;
从 MySQL 8.0.19 开始,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.0.21 及更高版本支持用户注释和用户属性,如第 13.7.1.3 节“CREATE USER 语句”中所述。这些可以分别ALTER USER
通过COMMENT
和
ATTRIBUTE
选项进行修改。您不能在同一ALTER USER
语句中同时指定这两个选项;尝试这样做会导致语法错误。
INFORMATION_SCHEMA.USER_ATTRIBUTES
用户评论和用户属性作为JSON对象
存储在
表中;用户评论作为comment
键的值存储在该表的 ATTRIBUTE 列中,如本讨论稍后所示。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 ''
. 这会在表中留下一个空comment
值
USER_ATTRIBUTES
;要完全删除用户评论,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
选项来锁定和解锁帐户,这些选项指定帐户的锁定状态。有关其他讨论,请参阅
第 6.2.20 节,“帐户锁定”。
如果指定了多个帐户锁定选项,则最后一个优先。
从 MySQL 8.0.19 开始,
ALTER USER ...
UNLOCK
解锁由于登录失败次数过多而暂时锁定的语句命名的任何帐户。请参阅
第 6.2.15 节,“密码管理”。
ALTER USER
如果成功则写入二进制日志,但如果失败则不写入;在这种情况下,将发生回滚并且不进行任何更改。写入二进制日志的语句包括所有命名用户。如果IF
EXISTS
给出该子句,这甚至包括不存在且未更改的用户。
如果原始语句更改了用户的凭据,则写入二进制日志的语句会为该用户指定适用的身份验证插件,确定如下:
原始语句中命名的插件(如果已指定)。
否则,如果用户存在,则使用与用户帐户关联的插件,如果用户不存在,则使用默认的身份验证插件。(如果写入二进制日志的语句必须为用户指定特定的身份验证插件,请将其包含在原始语句中。)
如果服务器在写入二进制日志的语句中为任何用户添加了默认身份验证插件,它会向错误日志中写入一条警告,命名这些用户。
如果原始语句指定了
FAILED_LOGIN_ATTEMPTS
or
PASSWORD_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
MODIFYfactor
IDENTIFIED WITH authentication_fido ASfido_hash_string
在复制上下文中,复制用户需要
PASSWORDLESS_USER_ADMIN
特权才能使用插件ALTER USER ... MODIFY
对配置为无密码身份验证的帐户执行操作 。authentication_fido