• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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.0.13起可用。如果给出:REPLACE 'current_auth_string'

    • REPLACE以明文(未加密)字符串指定要替换的帐户当前密码。
    • 如果需要更改帐户密码以指定当前密码,则必须提供该子句,以验证尝试进行更改的用户实际上知道当前密码。
    • 如果帐户的密码更改可以但不必指定当前密码,则该子句是可选的。
    • 如果给定了该子句但与当前密码不匹配,即使该子句是可选的,该语句也会失败。
    • REPLACE仅在更改当前用户的帐户密码时可以指定。

    有关通过指定当前密码进行密码验证的更多信息,请参见“帐户密码管理”。

    RETAIN CURRENT PASSWORD子句实现了双密码功能,自MySQL 8.0.14起可用。如果给出:

    • RETAIN CURRENT PASSWORD保留帐户当前密码作为其辅助密码,以替换任何现有的辅助密码。新密码成为主密码,但是客户端可以使用主密码或辅助密码使用该帐户连接到服务器。(例外:如果SET PASSWORD语句指定的新密码为空,则即使提供了辅助密码,二级密码也将变为空RETAIN CURRENT PASSWORD。)
    • 如果您指定RETAIN CURRENT PASSWORD的主密码为空,则该语句将失败。
    • 如果帐户具有辅助密码,并且您在未指定RETAIN CURRENT PASSWORD的情况下更改了其主密码,则辅助密码将保持不变。

    有关使用双重密码的更多信息,请参见“帐户密码管理”。

    SET PASSWORD允许以下auth_option语法:

    • ='auth_string'

      为帐户分配给定的文字密码。

    • TO RANDOM

      为帐户分配一个由MySQL随机生成的密码。该语句还返回结果集中的明文密码,以使其对执行该语句的用户或应用程序可用。

      有关结果集和随机生成的密码的特征的详细信息,请参见“随机密码生成”。

      从MySQL 8.0.18开始,可以生成随机密码。

    重要

    在某些情况下,SET PASSWORD可能会记录在服务器日志中或客户端的历史记录文件中,例如~/.mysql_history,这意味着具有对该信息的读取访问权限的任何人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,有关客户端日志记录的类似信息,请参见“ mysql客户端日志记录”。

    SET PASSWORD可以与带有或不带有FOR明确命名用户帐户的子句一起使用:

    • 该语句使用子句设置命名帐户的密码,该密码必须存在:FOR user

      SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
      
    • 如果没有no 子句,该语句将为当前用户设置密码:FOR user

      SET PASSWORD = 'auth_string';
      

      使用非匿名帐户连接到服务器的任何客户端都可以更改该帐户的密码。(特别是,您可以更改自己的密码。)要参见服务器将您用作身份验证的帐户,请调用以下CURRENT_USER()功能:

      SELECT CURRENT_USER();
      

    如果提供了子句,则帐户名使用“指定帐户名”中描述的格式。例如:FOR 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_ADMINSUPER特权,除了任何其他所需的权限。

    有关设置密码和身份验证插件的更多信息,请参见“帐户密码管理”和“可插入身份验证”。