Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.7.1.10 设置密码语句

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' each 表示一个明文(未加密)密码。

Note

使用 SET PASSWORD 语句分配密码,而不是使用 ALTER USER 语句来进行账户修改,包括分配密码。例如:

ALTER USER user IDENTIFIED BY 'auth_string';
Note

用于随机生成密码、密码验证和第二个密码的子句仅适用于使用内部存储认证插件的账户。对于使用外部认证系统的账户,密码管理必须在该系统中进行。关于内部认证存储的更多信息,请见 第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,那么第二个密码将保持不变。

有关双重密码的使用,请参见第8.2.15节,“密码管理”

SET PASSWORD 允许这些auth_option 语法:

  • = 'auth_string'

    将账户分配给定的文字密码。

  • TO RANDOM

    将账户分配给MySQL生成的随机密码。该语句也将返回明文密码,以便于用户或应用程序执行该语句时访问。

    有关结果集和随机生成密码的特征,请见随机密码生成

Important

在某些情况下,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 子句)需要对 mysql 系统架构的 UPDATE 权限。为自己设置密码(非匿名账户,无 FOR 子句)不需要特殊权限。

修改次要密码的语句需要这些权限:

read_only 系统变量启用时,SET PASSWORD 需要 CONNECTION_ADMIN 权限(或弃用的 SUPER 权限),此外还需要任何其他所需的权限。

关于设置密码和身份验证插件的更多信息,请见 第8.2.14节,“Assigning Account Passwords”,和 第8.2.17节,“Pluggable Authentication”