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';
随机密码生成、密码验证和辅助密码的子句仅适用于使用将凭据存储在 MySQL 中的认证插件的帐户。对于使用针对外部于 MySQL 的凭据系统进行认证的插件的帐户,必须针对该系统在外部进行密码管理。有关内部凭据存储的更多信息,请参见 第 8.2.15 节,“密码管理”。
使用 REPLACE '
子句执行密码验证。如果给出current_auth_string
'
REPLACE
指定要替换的帐户当前密码,作为明文(未加密)字符串。如果需要更改帐户的密码,则必须给出该子句来指定当前密码,以验证尝试进行更改的用户是否确实知道当前密码。
如果帐户的密码更改可以但不一定需要指定当前密码,则该子句是可选的。
如果给出该子句但不匹配当前密码,则语句将失败,即使该子句是可选的。
REPLACE
只能在更改当前用户的帐户密码时指定。
有关通过指定当前密码进行密码验证的更多信息,请参见 第 8.2.15 节,“密码管理”。
RETAIN CURRENT PASSWORD
子句实现双密码功能。如果给出
RETAIN CURRENT PASSWORD
将保留帐户当前密码作为其辅助密码,替换任何现有的辅助密码。新密码将成为主密码,但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。(例外:如果SET 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
子句)需要 UPDATE
权限,用于 mysql
系统模式。为自己设置密码(对于没有 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 节,“可插拔身份验证”。