文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF(US Ltr) - 40.0Mb
PDF(A4) - 40.1Mb
手册页(TGZ) - 258.2Kb
手册页(Zip) - 365.3Kb
Info(Gzip) - 4.0Mb
Info(Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  SET PASSWORD 语句

15.7.1.10 SET PASSWORD 语句

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 user 子句,则帐户名使用 第 8.2.4 节,“指定帐户名” 中描述的格式。例如

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 节,“可插拔身份验证”