13.7.1.1 ALTER USER 声明

ALTER USER [IF EXISTS]
    user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...

ALTER USER [IF EXISTS]
    USER() IDENTIFIED BY 'auth_string'

user:
    (see Section6.2.4, "Specifying Account Names")

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
}

tls_option: {
   SSL
 | X509
 | CIPHER 'cipher'
 | ISSUER 'issuer'
 | SUBJECT 'subject'
}

resource_option: {
    MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

password_option: {
    PASSWORD EXPIRE
  | PASSWORD EXPIRE DEFAULT
  | PASSWORD EXPIRE NEVER
  | PASSWORD EXPIRE INTERVAL N DAY
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

ALTER USER语句修改 MySQL 帐户。它允许为现有帐户修改身份验证,SSL/TLS,资源限制和密码 Management 属性。它也可以用于锁定和解锁帐户。

要使用ALTER USER,您必须具有mysql系统数据库的全局CREATE USER特权或UPDATE特权。启用read_only系统变量后,ALTER USER还需要SUPER特权。

默认情况下,如果您尝试修改不存在的用户,则会发生错误。如果给出了IF EXISTS子句,则该语句将为每个不存在的命名用户生成警告,而不是错误。

Important

在某些情况下,ALTER USER可能会记录在服务器日志中或 Client 端的历史记录文件(例如~/.mysql_history)中,这意味着任何具有对该信息的读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节“密码和日志记录”。有关 Client 端日志记录的类似信息,请参见第 4.5.1.3 节“ mysqlClient 端记录”

ALTER USER语句有多个方面,在以下主题下进行了描述:

ALTER USER 概述

对于每个受影响的帐户,ALTER USER修改mysql.user系统 table 中的相应行以反映该语句中指定的属性。未指定的属性保留其当前值。

每个帐户名称都使用第 6.2.4 节“指定帐户名”中描述的格式。帐户名的主机名部分(如果省略)默认为'%'。还可以指定CURRENT_USERCURRENT_USER()来引用与当前会话关联的帐户。

仅使用一种语法,可以使用USER()函数指定帐户:

ALTER USER USER() IDENTIFIED BY 'auth_string';

使用此语法可以更改您自己的密码,而无需按字面命名。

对于允许* auth_option 值跟随 user 值的ALTER USER语法, auth_option table 示通过指定帐户身份验证插件,凭据(例如密码)或同时指定两者来进行帐户身份验证的方式。每个 auth_option *值仅适用于紧随其后命名的帐户。

遵循* user *规范,该语句可能包括 SSL/TLS,资源限制,密码 Management 和锁定属性的选项。所有此类选项对语句都是“全局”的,并适用于语句中命名的“所有”帐户。

示例:更改帐户密码并使其过期。结果,用户必须使用指定的密码进行连接,并在下一次连接时选择一个新密码:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

示例:修改帐户以使用sha256_password身份验证插件和给定的密码。要求每 180 天选择一个新密码:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH sha256_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY;

示例:锁定或解锁帐户:

ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK;
ALTER USER 'jeffrey'@'localhost' ACCOUNT UNLOCK;

示例:要求一个帐户使用 SSL 进行连接,并构建每小时 20 个连接的限制:

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SSL WITH MAX_CONNECTIONS_PER_HOUR 20;

示例:更改多个帐户,并指定一些每个帐户属性和一些全局属性:

ALTER USER
  'jeffrey'@'localhost' IDENTIFIED BY 'new_password',
  'jeanne'@'localhost'
  REQUIRE SSL WITH MAX_USER_CONNECTIONS 2;

jeffrey之后的IDENTIFIED BY值仅适用于其前一个帐户,因此仅将jeffrey的密码更改为'jeffrey_new_password'。对于jeanne,没有每个帐户的值(因此,密码保持不变)。

其余属性全局应用于语句中命名的所有帐户,因此对于两个帐户:

  • 使用 SSL 需要连接。

  • 该帐户最多可用于两个同时连接。

在没有特定类型的期权的情况下,该帐户在这方面保持不变。例如,如果没有锁定选项,则帐户的锁定状态不会更改。

ALTER USER 身份验证选项

帐户名后可以带有* auth_option *身份验证选项,该选项指定帐户身份验证插件,凭据或同时指定两者:

    • auth_plugin *命名身份验证插件。插件名称可以是带引号的字符串 Literals 或不带引号的名称。插件名称存储在mysql.user系统 table 的plugin列中。

对于未指定身份验证插件的* auth_option *语法,默认插件由default_authentication_plugin系统变量的值指示。有关每个插件的说明,请参见第 6.4.1 节“身份验证插件”

  • 凭据存储在mysql.user系统 table 中。 'auth_string'值分别以明文(未加密)字符串或以与该帐户相关联的身份验证插件所期望的格式对哈希进行哈希处理来指定帐户凭据:

  • 对于使用BY 'auth_string'的语法,该字符串为 cleartext,并传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在mysql.usertable 中。插件可以使用指定的值,在这种情况下,不会发生哈希。

    • 对于使用AS 'auth_string'的语法,假定该字符串已采用身份验证插件所需的格式,并按原样存储在mysql.usertable 中。如果插件需要散列值,则该值必须已经以适合于该插件的格式进行散列,否则该值将无法被该插件使用,并且不会进行 Client 端连接的正确身份验证。

    • 如果验证插件不对验证字符串进行散列,则BY 'auth_string'AS 'auth_string'子句具有相同的效果:验证字符串按原样存储在mysql.user系统 table 中。

ALTER USER允许以下* auth_option *语法:

  • IDENTIFIED BY 'auth_string'

将帐户身份验证插件设置为默认插件,将明文'auth_string'值传递给该插件以进行可能的散列,并将结果存储在mysql.user系统 table 的帐户行中。

  • IDENTIFIED WITH auth_plugin

将帐户身份验证插件设置为* auth_plugin *,将凭据清除为空字符串(凭据与旧的身份验证插件相关联,而不与新的身份验证插件相关联),并将结果存储在mysql.user系统 table 的帐户行中。

此外,密码标记为已过期。下次连接时,用户必须选择一个新的。

  • IDENTIFIED WITH auth_plugin BY 'auth_string'

将帐户身份验证插件设置为* auth_plugin *,将明文'auth_string'值传递给该插件以进行可能的散列,并将结果存储在mysql.user系统 table 的帐户行中。

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

将帐户身份验证插件设置为* auth_plugin *,并按原样在mysql.user帐户行中存储'auth_string'值。如果插件需要哈希字符串,则假定该字符串已经以插件所需的格式进行哈希处理。

示例:将密码指定为明文;使用默认插件:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'password';

示例:指定身份验证插件以及明文密码值:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'password';

示例:指定身份验证插件以及哈希密码值:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';

有关设置密码和身份验证插件的其他信息,请参见第 6.2.10 节“分配帐户密码”第 6.2.13 节“可插入身份验证”

ALTER USER SSL/TLS 选项

除基于用户名和凭据的常规身份验证外,MySQL 还可以检查 X.509 证书属性。有关在 MySQL 上使用 SSL/TLS 的背景信息,请参见第 6.3 节“使用加密的连接”

要为 MySQL 帐户指定与 SSL/TLS 相关的选项,请使用REQUIRE子句,该子句指定一个或多个* tls_option *值。

REQUIRE选项的 Sequences 无关紧要,但不能指定两次选项。 AND关键字在REQUIRE个选项之间是可选的。

ALTER USER允许以下* tls_option *值:

  • NONE

指示该语句命名的所有帐户都没有 SSL 或 X.509 要求。如果用户名和密码有效,则允许未加密的连接。如果 Client 端具有正确的证书和密钥文件,则可以选择使用加密连接。

ALTER USER 'jeffrey'@'localhost' REQUIRE NONE;

Client 端默认尝试构建安全连接。对于具有REQUIRE NONE的 Client 端,如果无法构建安全连接,则连接尝试将退回到未加密的连接。要要求加密连接,Client 端只需要指定--ssl-mode=REQUIRED选项即可;如果无法构建安全连接,则连接尝试将失败。

  • SSL

告诉服务器仅允许该语句命名的所有帐户的加密连接。

ALTER USER 'jeffrey'@'localhost' REQUIRE SSL;

Client 端默认尝试构建安全连接。对于具有REQUIRE SSL的帐户,如果无法构建安全连接,则连接尝试将失败。

  • X509

对于该语句命名的所有帐户,要求 Client 出示有效的证书,但是确切的证书,颁发者和主题并不重要。唯一的要求是,应该可以使用其中一个 CA 证书来验证其签名。 X.509 证书的使用始终意味着加密,因此在这种情况下不需要SSL选项。

ALTER USER 'jeffrey'@'localhost' REQUIRE X509;

对于具有REQUIRE X509的帐户,Client 端必须指定--ssl-key--ssl-cert选项进行连接。 (建议但不要求也指定--ssl-ca,以便可以验证服务器提供的公共证书。)ISSUERSUBJECT也是如此,因为这些REQUIRE选项暗示了X509的要求。

  • ISSUER 'issuer'

对于该语句命名的所有帐户,要求 Client 端出示由 CA 'issuer'颁发的有效 X.509 证书。如果 Client 端出示的证书有效但具有不同的颁发者,则服务器将拒绝连接。 X.509 证书的使用始终意味着加密,因此在这种情况下不需要SSL选项。

ALTER USER 'jeffrey'@'localhost'
  REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/[email protected]';

由于ISSUER隐含了X509的要求,因此 Client 端必须指定--ssl-key--ssl-cert选项进行连接。 (建议但不要求也指定--ssl-ca,以便可以验证服务器提供的公共证书。)

  • SUBJECT 'subject'

对于该语句命名的所有帐户,要求 Client 端出示包含主题* subject *的有效 X.509 证书。如果 Client 端出示的证书有效但主题不同,则服务器拒绝连接。 X.509 证书的使用始终意味着加密,因此在这种情况下不需要SSL选项。

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/[email protected]';

MySQL 对'subject'值与证书中的值进行了简单的字符串比较,因此,字母和组件的 Sequences 必须完全按照证书中的 Sequences 给出。

由于SUBJECT隐含了X509的要求,因此 Client 端必须指定--ssl-key--ssl-cert选项进行连接。 (建议但不要求也指定--ssl-ca,以便可以验证服务器提供的公共证书。)

  • CIPHER 'cipher'

对于该语句命名的所有帐户,都需要使用特定的加密方法来加密连接。需要使用此选项以确保使用足够强度的密码和密钥长度。如果使用使用短加密密钥的旧算法,则加密可能会很弱。

ALTER USER 'jeffrey'@'localhost'
  REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

SUBJECTISSUERCIPHER选项可以在REQUIRE子句中组合:

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/[email protected]'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/[email protected]'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
ALTER USER 资源限制选项

第 6.2.16 节“设置帐户资源限制”中所述,可以限制帐户对服务器资源的使用。为此,请使用WITH子句指定一个或多个* resource_option *值。

WITH选项的 Sequences 无关紧要,除非多次指定给定的资源限制,则以最后一个实例为准。

ALTER USER允许以下* resource_option *值:

  • MAX_QUERIES_PER_HOUR count , MAX_UPDATES_PER_HOUR count , MAX_CONNECTIONS_PER_HOUR count

对于该语句命名的所有帐户,这些选项限制在任何给定的一小时内允许每个帐户进行多少次查询,更新和与服务器的连接。 (从查询缓存中提供结果的查询不计入MAX_QUERIES_PER_HOUR限制.)如果* count *为0(默认值),则 table 示该帐户没有限制。

  • MAX_USER_CONNECTIONS count

对于该语句命名的所有帐户,限制每个帐户同时连接到服务器的最大数量。非零* count 明确指定帐户的限制。如果 count *是0(缺省值),则服务器根据max_user_connections系统变量的全局值确定该帐户的并发连接数。如果max_user_connections也是零,则该帐户没有限制。

Example:

ALTER USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
ALTER USER 密码 Management 选项

ALTER USER支持多个* password_option *值用于密码过期 Management,以手动使帐户密码过期或构建其密码过期策略。策略选项不会使密码失效。相反,它们根据帐户密码的使用期限来确定服务器如何将自动过期应用于帐户。对于给定的帐户,将从最近一次密码更改的日期和时间开始评估其密码使用期限。

本节介绍密码 Management 选项的语法。有关构建密码 Management 策略的信息,请参阅第 6.2.11 节“密码 Management”

如果指定了多个密码 Management 选项,则最后一个优先。

这些选项仅适用于使用身份验证插件的帐户,该身份验证插件将凭据内部存储在 MySQL 中。对于使用插件对 MySQL 外部的凭据系统执行身份验证的帐户,密码 Management 也必须在外部针对该系统进行处理。有关内部凭据存储的更多信息,请参见第 6.2.11 节“密码 Management”

如果帐户密码已手动过期,或者根据自动过期策略,认为密码使用期限大于允许的使用期限,则 Client 端会话将在受限模式下运行。在受限模式下,会话中执行的操作会导致错误,直到用户构建新的帐户密码为止。有关受限模式的信息,请参见第 6.2.12 节“过期密码的服务器处理”

Note

尽管可以通过将过期的密码设置为当前值来“重置”它,但出于良好的 Policy 考虑,最好选择其他密码。

ALTER USER允许以下* password_option *值来控制密码的到期时间:

  • PASSWORD EXPIRE

立即将该语句命名的所有帐户的密码标记为过期。

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
  • PASSWORD EXPIRE DEFAULT

设置该语句命名的所有帐户,以便应用全局过期策略,如default_password_lifetime系统变量所指定。

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
  • PASSWORD EXPIRE NEVER

该到期选项将覆盖该语句命名的所有帐户的全局策略。对于每个密码,它都会禁用密码过期,以使密码永不过期。

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
  • PASSWORD EXPIRE INTERVAL N DAY

该到期选项将覆盖该语句命名的所有帐户的全局策略。对于每个密码,它将密码生存期设置为* N *天。以下声明要求每 180 天更改一次密码:

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;
ALTER USER 帐户锁定选项

MySQL 使用ACCOUNT LOCKACCOUNT UNLOCK选项支持帐户锁定和解锁,这两个选项指定了帐户的锁定状态。有关其他讨论,请参见第 6.2.15 节“锁定帐户”

如果指定了多个帐户锁定选项,则最后一个优先。