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
权限来使用RETAIN CURRENT PASSWORD
或DISCARD OLD PASSWORD
子句,以便在自己的账户上应用ALTER USER
语句。该权限是必要的,因为大多数用户只需要一个密码。 -
如果账户需要为所有账户管理次要密码,则需要
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
权限。
-
当 read_only
系统变量启用时, ALTER USER
还需要 CONNECTION_ADMIN
权限(或已弃用的 SUPER
权限)。
这些附加权限考虑也适用:
-
系统变量
身份验证策略
对ALTER USER
语句的身份验证相关子句的使用施加了某些约束;有关详细信息,请参阅该变量的描述。如果您拥有身份验证策略管理员
权限,则这些约束不适用。 -
要修改使用无密码身份验证的帐户,您必须拥有
无密码用户管理员
权限。
默认情况下,如果尝试修改不存在的用户,将发生错误。如果给出了 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
语法,允许在 user
值后跟随 auth_option
值,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;
该 IDENTIFIED BY
值仅适用于其紧接着的账户,因此它仅将密码更改为 '
仅适用于 jeffrey_new_password
'jeffrey
。对于 jeanne
,没有每个账户的值(因此密码保持不变)。对于 josh
,IDENTIFIED BY
建立了一个新密码('
),josh_new_password
'REPLACE
指定了验证用户是否知道当前密码('
),并且当前密码也保留为账户的次要密码。(因此,josh_current_password
'josh
可以使用主要或次要密码连接。)
其余属性适用于语句中的所有账户,因此对于两个账户:
-
连接需要使用 SSL。
-
账户最多可以有两个同时连接。
-
密码更改不能重复使用最近五个密码。
示例:丢弃 josh
的次要密码,仅保留主要密码:
ALTER USER 'josh'@'localhost' DISCARD OLD PASSWORD;
如果没有特定类型的选项,账户在该方面保持不变。例如,没有锁定选项,账户的锁定状态保持不变。
账户名称可以跟随一个 auth_option
身份验证选项,该选项指定账户身份验证插件、凭据或两者。它还可以包括一个密码验证子句,指定要被替换的账户当前密码,并管理账户是否具有次要密码。
随机密码生成、密码验证和次要密码子句仅适用于使用内部存储凭据的身份验证插件的账户。对于使用外部凭据系统的身份验证插件,密码管理必须在外部系统中处理。有关内部凭据存储的更多信息,请参阅 第 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
子句将帐户当前密码保留为其次要密码,如本节前面所述。 -
使用
auth_plugin
身份验证插件,身份验证字符串为 'auth_string
'将账户身份验证插件设置为
auth_plugin
,并将 'auth_string
' 值存储在mysql.user
账户行中。如果插件需要哈希字符串,则假定字符串已经以插件所需的格式进行哈希处理。 -
丢弃旧密码
丢弃账户的辅助密码,如果存在的话,如本节前面所述。
示例:指定明文密码;使用默认插件:
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
子句,用于添加、修改或删除身份验证因素。在每种情况下,子句指定对一个身份验证因素的操作,optionally 对另一个身份验证因素的操作。对于每个操作,factor
项指定 FACTOR
关键字,后跟数字 2 或 3,以指示操作是否应用于第二个或第三个身份验证因素。(在此上下文中不允许使用 1。要对第一个身份验证因素进行操作,请使用 ALTER USER 身份验证选项 中描述的语法。)
ALTER 用户
多因素身份验证子句约束由 身份验证策略
系统变量定义。例如,身份验证策略
设置控制帐户可能拥有的身份验证因素数量,以及每个因素允许的身份验证方法。请参阅 配置多因素身份验证策略。
当 ALTER 用户
在单个语句中添加、修改或删除第二个和第三个因素时,操作将顺序执行,但如果序列中的任何操作失败,则整个 ALTER 用户
语句将失败。
对于 ADD
,每个命名的因素必须不存在,否则无法添加。对于 MODIFY
和 DROP
,每个命名的因素必须存在以便修改或删除。如果定义了第二个和第三个因素,删除第二个因素将导致第三个因素变为第二个因素。
该语句删除身份验证因素 2 和 3,从而将帐户从 3FA 转换为 1FA:
ALTER USER 'user' DROP 2 FACTOR 3 FACTOR;
有关其他 ADD
、MODIFY
和 DROP
示例,请参阅 多因素身份验证入门。
有关因素特定规则的信息,该规则确定了身份验证子句的默认身份验证插件,请参阅 默认身份验证插件。
ALTER 用户
具有使 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 相关选项,请使用 REQUIRE
子句,指定一个或多个 tls_option
值。
REQUIRE
选项的顺序无关紧要,但不能指定两次同一个选项。AND
关键字在 REQUIRE
选项之间是可选的。
ALTER 用户
允许这些 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 证书。如果客户端提供的证书有效但主题不同,服务器将拒绝连接。使用 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';
可以在 REQUIRE
子句中组合 SUBJECT
、ISSUER
和 CIPHER
选项:
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
值:
-
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 内部存储凭证的身份验证插件的账户。对于使用外部凭证系统的身份验证插件的账户,密码管理必须在该系统中外部处理。有关内部凭证存储的更多信息,请参阅 第 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;
-
密码历史
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
天,以禁止重用最近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.3 支持用户注释和用户属性,如 第 15.7.1.3 节,“CREATE USER 语句” 所述。这些可以使用 ALTER USER
语句通过 COMMENT
和 ATTRIBUTE
选项修改。您不能在同一个 ALTER USER
语句中指定这两个选项;尝试这样做将导致语法错误。
用户注释和用户属性存储在信息模式 USER_ATTRIBUTES
表中作为 JSON 对象;用户注释存储在该表的 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 ''
。这将在 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 哈希字符串
-
在复制上下文中,复制用户需要
无密码用户管理员
权限来执行ALTER USER ... MODIFY
操作在使用authentication_webauthn
插件进行无密码身份验证的账户上。