SET PASSWORD [FOR user] auth_option
[REPLACE 'current_auth_string']
[RETAIN CURRENT PASSWORD]
auth_option: {
= 'auth_string'
| TO RANDOM
}
该 SET PASSWORD
语句将密码分配给 MySQL 用户账户。密码可以在语句中明确指定,也可以由 MySQL 随机生成。该语句还可以包括密码验证子句,以指定要替换的当前密码,以及管理账户是否具有辅助密码的子句。'
和 auth_string
''
都表示明文(未加密)密码。current_auth_string
'
而不是使用 SET PASSWORD
分配密码,ALTER USER
是更改账户信息,包括分配密码的首选语句。例如:
ALTER USER user IDENTIFIED BY 'auth_string';
随机密码生成、密码验证和辅助密码子句仅适用于使用内部存储凭证的身份验证插件的账户。对于使用外部凭证系统的身份验证插件,密码管理必须在外部系统中处理。有关内部凭证存储的更多信息,请参阅 第 8.2.15 节,“密码管理”。
该 REPLACE '
子句执行密码验证。如果给定:current_auth_string
'
-
REPLACE
指定要替换的当前密码作为明文(未加密)字符串。 -
该子句必须给定,如果账户密码更改需要指定当前密码,以验证用户是否真正知道当前密码。
-
该子句是可选的,如果账户密码更改可以但不需要指定当前密码。
-
如果该子句给定但不匹配当前密码,即使该子句是可选的,语句将失败。
-
REPLACE
只能在更改当前用户的账户密码时指定。
有关通过指定当前密码进行密码验证的更多信息,请参阅 第 8.2.15 节,“密码管理”。
该 RETAIN CURRENT PASSWORD
子句实现双密码功能。如果给定:
-
RETAIN CURRENT PASSWORD
保留账户当前密码作为辅助密码,替换任何现有的辅助密码。新的密码变为主密码,但客户端可以使用账户连接到服务器,使用主密码或辅助密码。(例外:如果新密码为空,辅助密码也将为空,即使给定RETAIN CURRENT PASSWORD
。) -
如果您为具有空主密码的账户指定
RETAIN CURRENT PASSWORD
,语句将失败。 -
如果账户具有辅助密码,并且您更改其主密码而不指定
RETAIN CURRENT PASSWORD
,辅助密码将保持不变。
有关双密码使用的更多信息,请参阅 第 8.2.15 节,“密码管理”。
SET PASSWORD
允许以下 auth_option
语法:
-
= '
auth_string
'将账户分配给定的明文密码。
-
TO RANDOM
将账户分配由 MySQL 随机生成的密码。该语句还将明文密码返回到结果集中,以便用户或执行语句的应用程序使用。
有关随机生成密码的结果集和特征的详细信息,请参阅 随机密码生成。
在某些情况下,SET PASSWORD
可能会被记录在服务器日志或客户端的历史文件中,例如 ~/.mysql_history
,这意味着明文密码可能会被拥有读取权限的人读取。有关服务器日志中这种情况的条件和控制方法,请参阅 第 8.1.2.3 节,“密码和日志记录”。关于客户端日志记录的类似信息,请参阅 第 6.5.1.3 节,“mysql 客户端日志记录”。
SET PASSWORD
可以带或不带 FOR
子句,明确指定用户账户:
-
带有
FOR
子句时,该语句设置指定账户的密码,该账户必须存在:user
SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
-
不带
FOR
子句时,该语句设置当前用户的密码:user
SET PASSWORD = 'auth_string';
任何客户端都可以使用非匿名账户连接到服务器,并更改该账户的密码。(特别是,您可以更改自己的密码。)要查看服务器认证的账户,请调用
CURRENT_USER()
函数:SELECT CURRENT_USER();
如果给出了 FOR
子句,账户名称使用 第 8.2.4 节,“指定账户名称” 中描述的格式。例如:user
SET PASSWORD FOR 'bob'@'%.example.org' = 'auth_string';
账户名称的主机名部分,如果省略,默认为 '%'
。
SET PASSWORD
将字符串解释为明文字符串,将其传递给关联的身份验证插件,并将插件返回的结果存储在 mysql.user
系统表的账户行中。(插件可能将值哈希到它期望的加密格式中。插件可能使用指定的值,在这种情况下,不会发生哈希。)
设置命名账户的密码(带有 FOR
子句)需要 mysql
系统模式的 UPDATE
权限。设置自己的密码(对于非匿名账户,无 FOR
子句)不需要特殊权限。
修改次要密码的语句需要这些权限:
-
需要
APPLICATION_PASSWORD_ADMIN
权限来使用RETAIN CURRENT PASSWORD
子句,以便在自己的账户上应用SET PASSWORD
语句。该权限是必要的,因为大多数用户只需要一个密码。 -
如果账户需要为所有账户管理次要密码,应该授予
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
。
当 read_only
系统变量启用时,SET PASSWORD
需要 CONNECTION_ADMIN
权限(或已弃用的 SUPER
权限),此外还需要其他所需权限。
有关设置密码和身份验证插件的更多信息,请参阅 第 8.2.14 节,“分配账户密码” 和 第 8.2.17 节,“可插拔身份验证”。