MySQL 8.0 リファレンスマニュアル


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] ...
    [COMMENT 'comment_string' | ATTRIBUTE 'json_object']

ALTER USER [IF EXISTS] USER() user_func_auth_option

ALTER USER [IF EXISTS]
    user DEFAULT ROLE
    {NONE | ALL | role [, role ] ...}

user:
    (see セクション6.2.4「アカウント名の指定」)

auth_option: {
    IDENTIFIED BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED BY RANDOM PASSWORD
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | DISCARD OLD PASSWORD
}

user_func_auth_option: {
    IDENTIFIED BY 'auth_string'
        [REPLACE 'current_auth_string']
        [RETAIN CURRENT PASSWORD]
  | DISCARD OLD PASSWORD
}

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 [DEFAULT | NEVER | INTERVAL N DAY]
  | PASSWORD HISTORY {DEFAULT | N}
  | PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
  | PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
  | FAILED_LOGIN_ATTEMPTS N
  | PASSWORD_LOCK_TIME {N | UNBOUNDED}
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

ALTER USER ステートメントによって、MySQL アカウントが変更されます。 既存のアカウントの認証、ロール、SSL/TLS、リソース制限およびパスワード管理プロパティを変更できます。 また、アカウントのロックおよびロック解除にも使用できます。

ほとんどの場合、ALTER USER には mysql システムスキーマに対するグローバル CREATE USER 権限または UPDATE 権限が必要です。 例外は次のとおりです:

  • 匿名以外のアカウントを使用してサーバーに接続したクライアントはすべて、そのアカウントのパスワードを変更できます。 (特に、自分のパスワードを変更できます。) サーバーが認証したアカウントを確認するには、CURRENT_USER() 関数を呼び出します:

    SELECT CURRENT_USER();
  • DEFAULT ROLE 構文の場合、ALTER USER には次の権限が必要です:

    • 別のユーザーのデフォルトロールを設定するには、mysql.default_roles システムテーブルに対するグローバル CREATE USER 権限または UPDATE 権限が必要です。

    • 自分のデフォルトロールを設定する場合、デフォルトとして必要なロールが付与されているかぎり、特別な権限は必要ありません。

  • セカンダリパスワードを変更するステートメントには、次の権限が必要です:

    • 自分のアカウントに適用される ALTER USER ステートメントに RETAIN CURRENT PASSWORD または DISCARD OLD PASSWORD 句を使用するには、APPLICATION_PASSWORD_ADMIN 権限が必要です。 ほとんどのユーザーは 1 つのパスワードのみを必要とするため、自分のセカンダリパスワードを操作するには権限が必要です。

    • アカウントがすべてのアカウントのセカンダリパスワードの操作を許可される場合は、APPLICATION_PASSWORD_ADMIN ではなく CREATE USER 権限が必要です。

read_only システム変数が有効になっている場合、ALTER USER にはさらに CONNECTION_ADMIN 権限 (または非推奨の SUPER 権限) が必要です。

デフォルトでは、存在しないユーザーを変更しようとすると、エラーが発生します。 IF EXISTS 句を指定すると、ステートメントは、存在しない指定ユーザーごとに、エラーではなく、警告を生成します。

重要

状況によっては、ALTER USER はサーバーログまたはクライアント側の ~/.mysql_history などの履歴ファイルに記録される場合があります。つまり、クリアテキストパスワードは、その情報への読取りアクセス権を持つすべてのユーザーが読み取ることができます。 これがサーバーログで発生する条件およびこれを制御する方法については、セクション6.1.2.3「パスワードおよびロギング」を参照してください。 クライアント側のロギングに関する同様の情報については、セクション4.5.1.3「mysql クライアントロギング」を参照してください。

次のトピックで説明するように、ALTER USER ステートメントにはいくつかの側面があります:

ALTER USER の概要

影響を受けるアカウントごとに、ALTER USERmysql.user システムテーブルの対応する行を変更して、ステートメントで指定されたプロパティを反映します。 未指定のプロパティは現在の値を保持します。

各アカウント名には、セクション6.2.4「アカウント名の指定」で説明されている形式が使用されます。 アカウント名のホスト名部分は、省略すると'%'にデフォルト設定されます。 CURRENT_USER または CURRENT_USER() を指定して、現在のセッションに関連付けられているアカウントを参照することもできます。

一方の構文の場合のみ、USER() 関数でアカウントを指定できます:

ALTER USER USER() IDENTIFIED BY 'auth_string';

この構文を使用すると、アカウントに文字どおりの名前を付けずに自分のパスワードを変更できます。 (構文では、ALTER USER 認証オプション で説明されている REPLACERETAIN CURRENT PASSWORD および DISCARD OLD PASSWORD 句もサポートされています。)

MySQL 8.0.21 以降では、セクション13.7.1.3「CREATE USER ステートメント」 で説明されているように、ユーザーコメントおよびユーザー属性がサポートされます。 これらは、それぞれ COMMENT および ATTRIBUTE オプションを使用して、ALTER USER を使用して変更できます。 同じ ALTER USER ステートメントで両方のオプションを指定することはできません。指定しようとすると構文エラーが発生します。

ユーザーコメントおよびユーザー属性は、JSON オブジェクトとして INFORMATION_SCHEMA.USER_ATTRIBUTES テーブルに格納されます。この説明で後述するように、ユーザーコメントは、このテーブルの ATTRIBUTE カラムの comment キーの値として格納されます。 COMMENT テキストは任意の任意の引用符付きテキストで、既存のユーザーコメントを置換できます。 ATTRIBUTE 値は、JSON オブジェクトの有効な文字列表現である必要があります。 これは、JSON_MERGE_PATCH() 関数が既存のユーザー属性および新しいユーザー属性で使用されているかのように、既存のユーザー属性とマージされます。再使用されるキーについては、次に示すように、新しい値によって古い値が上書きされます:

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"foo": "bar"} |
+------+-----------+----------------+
1 row in set (0.11 sec)

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"baz": "faz", "foo": "moo"}';
Query OK, 0 rows affected (0.22 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+------------------------------+
| USER | HOST      | ATTRIBUTE                    |
+------+-----------+------------------------------+
| bill | localhost | {"baz": "faz", "foo": "moo"} |
+------+-----------+------------------------------+
1 row in set (0.00 sec)

ユーザー属性からキーとその値を削除するには、次のように、キーを JSON null に設定します (小文字で引用符で囲まれていない必要があります):

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"foo": null}';
Query OK, 0 rows affected (0.08 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"baz": "faz"} |
+------+-----------+----------------+
1 row in set (0.00 sec)

既存のユーザーコメントを空の文字列に設定するには、ALTER USER ... COMMENT ''を使用します。 これにより、USER_ATTRIBUTES テーブルに空の comment 値が残されます。ユーザーコメントを完全に削除するには、カラムキーの値を JSON null に設定して ALTER USER ... ATTRIBUTE ... を使用します (小文字では引用符で囲まれていません)。 これは、次の一連の SQL ステートメントで示されています:

mysql> ALTER USER 'bill'@'localhost' COMMENT 'Something about Bill';
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+---------------------------------------------------+
| USER | HOST      | ATTRIBUTE                                         |
+------+-----------+---------------------------------------------------+
| bill | localhost | {"baz": "faz", "comment": "Something about Bill"} |
+------+-----------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'bill'@'localhost' COMMENT '';
Query OK, 0 rows affected (0.09 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+-------------------------------+
| USER | HOST      | ATTRIBUTE                     |
+------+-----------+-------------------------------+
| bill | localhost | {"baz": "faz", "comment": ""} |
+------+-----------+-------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'bill'@'localhost' ATTRIBUTE '{"comment": null}';
Query OK, 0 rows affected (0.07 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->     WHERE USER='bill' AND HOST='localhost';
+------+-----------+----------------+
| USER | HOST      | ATTRIBUTE      |
+------+-----------+----------------+
| bill | localhost | {"baz": "faz"} |
+------+-----------+----------------+
1 row in set (0.00 sec)

auth_option 値が user 値に従うことを許可する ALTER USER 構文の場合、auth_option は、アカウント認証プラグイン、資格証明 (パスワードなど) またはその両方を指定して、アカウントがどのように認証されるかを示します。 各 auth_option 値は、直前に指定されたアカウントにのみを適用します。

user 仕様に従って、ステートメントに SSL/TLS、リソース制限、パスワード管理およびロックプロパティのオプションを含めることができます。 このようなオプションはすべて、ステートメントに対する global であり、ステートメントで指定された all アカウントに適用されます。

例: アカウントパスワードを変更して期限切れにします。 そのため、ユーザーは指定されたパスワードで接続し、次の接続時に新しいパスワードを選択する必要があります:

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

例: caching_sha2_password 認証プラグインと指定されたパスワードを使用するようにアカウントを変更します。 180 日ごとに新しいパスワードを選択し、ログイン失敗トラッキングを有効にする必要があります。これにより、次の 3 つのパスワードが連続して正しくないと、一時的なアカウントのロックが 2 日間発生します:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;

例: アカウントのロックまたはロック解除:

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

例: SSL を使用して接続し、1 時間あたり 20 の接続を確立するためのアカウントが必要です:

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

例: アカウントごとのプロパティおよびグローバルプロパティを指定して、複数のアカウントを変更します:

ALTER USER
  'jeffrey'@'localhost'
    IDENTIFIED BY 'jeffrey_new_password',
  'jeanne'@'localhost',
  'josh'@'localhost'
    IDENTIFIED BY 'josh_new_password'
    REPLACE 'josh_current_password'
    RETAIN CURRENT PASSWORD
  REQUIRE SSL WITH MAX_USER_CONNECTIONS 2
  PASSWORD HISTORY 5;

jeffrey に続く IDENTIFIED BY 値は直前のアカウントにのみ適用されるため、パスワードは jeffrey'jeffrey_new_password'にのみ変更されます。 jeanne の場合、アカウントごとの値はありません (そのため、パスワードは変更されません)。 josh の場合、IDENTIFIED BY は新しいパスワード ('josh_new_password') を確立し、ALTER USER ステートメントを発行するユーザーが現在のパスワード ('josh_current_password') を知っていることを確認するために REPLACE が指定され、現在のパスワードもアカウントセカンダリパスワードとして保持されます。 (その結果、josh はプライマリパスワードまたはセカンダリパスワードのいずれかを使用して接続できます。)

残りのプロパティは、ステートメントで指定されたすべてのアカウントにグローバルに適用されるため、両方のアカウントについて次のようになります:

  • SSL を使用するには接続が必要です。

  • アカウントは、最大 2 つの同時接続に使用できます。

  • パスワードの変更では、最新の 5 つのパスワードを再利用できません。

例: アカウントにプライマリパスワードのみを残して、josh のセカンダリパスワードを破棄します:

ALTER USER 'josh'@'localhost' DISCARD OLD PASSWORD;

特定のタイプのオプションがない場合、アカウントはその点で変更されません。 たとえば、ロックオプションを指定しない場合、アカウントのロック状態は変更されません。

ALTER USER 認証オプション

アカウント名の後に、アカウント認証プラグインまたは資格証明 (あるいはその両方) を指定する auth_option 認証オプションを続けることができます。 また、置換するアカウントの現在のパスワードを指定する password-verification 句や、アカウントにセカンダリパスワードがあるかどうかを管理する句も含めることができます。

注記

ランダムパスワード生成、パスワード検証およびセカンダリパスワードの句は、資格証明を MySQL に内部的に格納する認証プラグインを使用するアカウントにのみ適用されます。 MySQL の外部にある資格証明システムに対して認証を実行するプラグインを使用するアカウントの場合、パスワード管理もそのシステムに対して外部で処理する必要があります。 内部資格証明記憶域の詳細は、セクション6.2.15「パスワード管理」 を参照してください。

  • auth_plugin は、認証プラグインに名前を付けます。 プラグイン名は、引用符で囲まれた文字列リテラルまたは引用符で囲まれていない名前です。 プラグイン名は、mysql.user システムテーブルの plugin カラムに格納されます。

    認証プラグインを指定しない auth_option 構文の場合、デフォルトのプラグインは default_authentication_plugin システム変数の値で示されます。 各プラグインの説明については、セクション6.4.1「認証プラグイン」 を参照してください。

  • 内部的に格納される資格証明は、mysql.user システムテーブルに格納されます。 'auth_string'値または RANDOM PASSWORD は、アカウント資格証明をクリアテキスト (暗号化されていない) 文字列として指定するか、アカウントに関連付けられた認証プラグインで想定される形式でハッシュします:

    • BY 'auth_string'を使用する構文の場合、文字列はクリアテキストであり、ハッシュ化のために認証プラグインに渡されます。 プラグインによって返される結果は、mysql.user テーブルに格納されます。 プラグインは、指定された値を使用できます。この場合、ハッシュは発生しません。

    • BY RANDOM PASSWORD を使用する構文の場合、MySQL はランダムパスワードをクリアテキストとして生成し、ハッシュ化のために認証プラグインに渡します。 プラグインによって返される結果は、mysql.user テーブルに格納されます。 プラグインは、指定された値を使用できます。この場合、ハッシュは発生しません。

      ランダムに生成されたパスワードは、MySQL 8.0.18 で使用でき、ランダムパスワード生成 で説明されている特性があります。

    • AS 'auth_string'を使用する構文の場合、文字列はすでに認証プラグインに必要な形式であるとみなされ、mysql.user テーブルにそのまま格納されます。 プラグインにハッシュ値が必要な場合、その値はプラグインに適した形式ですでにハッシュされている必要があります。そうでない場合、プラグインはこの値を使用できず、クライアント接続の正しい認証は行われません。

      MySQL 8.0.17 の時点では、ハッシュ文字列は文字列リテラルまたは 16 進数値のいずれかになります。 後者は、print_identified_with_as_hex システム変数が有効になっている場合に、印刷不可能な文字を含むパスワードハッシュに対して SHOW CREATE USER によって表示される値のタイプに対応します。

    • 認証プラグインが認証文字列のハッシュを実行しない場合、BY 'auth_string'句と AS 'auth_string'句は同じ効果を持ちます: 認証文字列は、mysql.user システムテーブルにそのまま格納されます。

  • REPLACE 'current_auth_string'句はパスワード検証を実行し、MySQL 8.0.13 の時点で使用できます。 指定された場合:

    • REPLACE は、置換するアカウントの現在のパスワードをクリアテキスト (暗号化されていない) 文字列として指定します。

    • 変更しようとしているユーザーが実際に現在のパスワードを認識していることを確認するために、現在のパスワードを指定するためにのパスワード変更が必要な場合は、句を指定する必要があります。

    • アカウントのパスワードが変更される可能性があるが、現在のパスワードを指定する必要がない場合、句はオプションです。

    • 句が指定されているが、句がオプションであっても現在のパスワードと一致しない場合、ステートメントは失敗します。

    • REPLACE は、現在のユーザーのアカウントパスワードを変更する場合にのみ指定できます。

    現在のパスワードを指定したパスワード検証の詳細は、セクション6.2.15「パスワード管理」 を参照してください。

  • RETAIN CURRENT PASSWORD 句および DISCARD OLD PASSWORD 句はデュアルパスワード機能を実装し、MySQL 8.0.14 の時点で使用できます。 どちらもオプションですが、指定した場合は次の効果があります:

    • RETAIN CURRENT PASSWORD は、アカウントの現在のパスワードをセカンダリパスワードとして保持し、既存のセカンダリパスワードを置き換えます。 新しいパスワードはプライマリパスワードになりますが、クライアントはアカウントを使用して、プライマリパスワードまたはセカンダリパスワードのいずれかを使用してサーバーに接続できます。 (例外: ALTER USER ステートメントで指定された新しいパスワードが空の場合、RETAIN CURRENT PASSWORD が指定されていても、セカンダリパスワードも空になります。)

    • プライマリパスワードが空のアカウントに RETAIN CURRENT PASSWORD を指定すると、ステートメントは失敗します。

    • アカウントにセカンダリパスワードがあり、RETAIN CURRENT PASSWORD を指定せずにプライマリパスワードを変更した場合、セカンダリパスワードは変更されません。

    • アカウントに割り当てられた認証プラグインを変更すると、セカンダリパスワードは破棄されます。 認証プラグインを変更し、RETAIN CURRENT PASSWORD も指定すると、ステートメントは失敗します。

    • セカンダリパスワードが存在する場合、DISCARD OLD PASSWORD はセカンダリパスワードを破棄します。 アカウントはプライマリパスワードのみを保持し、クライアントはプライマリパスワードのみを使用してサーバーに接続するためにアカウントを使用できます。

    デュアルパスワードの使用の詳細は、セクション6.2.15「パスワード管理」 を参照してください。

ALTER USER では、次の auth_option 構文が許可されます:

  • IDENTIFIED BY 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    アカウント認証プラグインをデフォルトプラグインに設定し、ハッシュ化のためにクリアテキストの'auth_string'値をプラグインに渡し、その結果を mysql.user システムテーブルのアカウント行に格納します。

    このセクションで前述したように、REPLACE 句を指定すると、アカウントの現在のパスワードが指定されます。

    RETAIN CURRENT PASSWORD 句を指定すると、このセクションで前述したように、アカウントの現在のパスワードがセカンダリパスワードとして保持されます。

  • IDENTIFIED BY RANDOM PASSWORD [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    アカウント認証プラグインをデフォルトのプラグインに設定し、ランダムなパスワードを生成して、ハッシュ可能なプラグインにクリアテキストのパスワード値を渡し、その結果を mysql.user システムテーブルのアカウント行に格納します。 このステートメントは、ステートメントを実行しているユーザーまたはアプリケーションが使用できるように、クリアテキストのパスワードも結果セットに返します。 ランダムに生成されるパスワードの結果セットおよび特性の詳細は、ランダムパスワード生成 を参照してください。

    このセクションで前述したように、REPLACE 句を指定すると、アカウントの現在のパスワードが指定されます。

    RETAIN CURRENT PASSWORD 句を指定すると、このセクションで前述したように、アカウントの現在のパスワードがセカンダリパスワードとして保持されます。

  • IDENTIFIED WITH auth_plugin

    アカウント認証プラグインを auth_plugin に設定し、資格証明を空の文字列にクリアし (資格証明は新しい認証プラグインではなく古い認証プラグインに関連付けられます)、その結果を mysql.user システムテーブルのアカウント行に格納します。

    また、パスワードは期限切れとマークされます。 ユーザーは、次に接続するときに新しいものを選択する必要があります。

  • IDENTIFIED WITH auth_plugin BY 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    アカウント認証プラグインを auth_plugin に設定し、ハッシュ化のためにクリアテキストの'auth_string'値をプラグインに渡し、その結果を mysql.user システムテーブルのアカウント行に格納します。

    このセクションで前述したように、REPLACE 句を指定すると、アカウントの現在のパスワードが指定されます。

    RETAIN CURRENT PASSWORD 句を指定すると、このセクションで前述したように、アカウントの現在のパスワードがセカンダリパスワードとして保持されます。

  • IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD]

    アカウント認証プラグインを auth_plugin に設定し、ランダムパスワードを生成し、ハッシュ化のためにクリアテキストパスワード値をプラグインに渡し、その結果を mysql.user システムテーブルのアカウント行に格納します。 このステートメントは、ステートメントを実行しているユーザーまたはアプリケーションが使用できるように、クリアテキストのパスワードも結果セットに返します。 ランダムに生成されるパスワードの結果セットおよび特性の詳細は、ランダムパスワード生成 を参照してください。

    このセクションで前述したように、REPLACE 句を指定すると、アカウントの現在のパスワードが指定されます。

    RETAIN CURRENT PASSWORD 句を指定すると、このセクションで前述したように、アカウントの現在のパスワードがセカンダリパスワードとして保持されます。

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

    アカウント認証プラグインを auth_plugin に設定し、'auth_string'値を mysql.user アカウント行にそのまま格納します。 プラグインにハッシュ文字列が必要な場合、文字列はプラグインに必要な形式ですでにハッシュされているとみなされます。

  • DISCARD OLD PASSWORD

    このセクションで前述したように、アカウントセカンダリパスワードがある場合は破棄します。

例: パスワードをクリアテキストで指定します。デフォルトのプラグインが使用されます:

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
             BY 'password'
             REPLACE 'current_password';

REPLACE は現在のユーザーパスワードの変更のみを許可されているため、現在のユーザーが jeffrey でないかぎり、前述のステートメントは失敗します。

例: 新しいプライマリパスワードを設定し、既存のパスワードをセカンダリパスワードとして保持します:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password'
  RETAIN CURRENT PASSWORD;

例: セカンダリパスワードを破棄し、アカウントにプライマリパスワードのみを残します:

ALTER USER 'jeffery'@'localhost' DISCARD OLD PASSWORD;

例: ハッシュされたパスワード値とともに認証プラグインを指定します:

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

パスワードと認証プラグインの設定の詳細は、セクション6.2.14「アカウントパスワードの割り当て」およびセクション6.2.17「プラガブル認証」を参照してください。

ALTER USER ロールのオプション

ALTER USER ... DEFAULT ROLE では、ユーザーがサーバーに接続して認証するとき、またはユーザーがセッション中に SET ROLE DEFAULT ステートメントを実行するときにアクティブになるロールを定義します。

ALTER USER ... DEFAULT ROLE は、SET DEFAULT ROLE の代替構文です (セクション13.7.1.9「SET DEFAULT ROLE ステートメント」 を参照)。 ただし、ALTER USER では単一のユーザーに対してのみデフォルトを設定できますが、SET DEFAULT ROLE では複数のユーザーに対してデフォルトを設定できます。 一方、ALTER USER ステートメントのユーザー名として CURRENT_USER を指定できますが、SET DEFAULT ROLE のユーザー名は指定できません。

各ユーザーアカウント名には、前述の形式が使用されます。

各ロール名は、セクション6.2.5「ロール名の指定」 で説明されている形式を使用します。 例:

ALTER USER 'joe'@'10.0.0.1' DEFAULT ROLE administrator, developer;

ロール名のホスト名部分は、省略すると'%'にデフォルト設定されます。

DEFAULT ROLE キーワードに続く句では、次の値が許可されます:

  • NONE: デフォルトを NONE (ロールなし) に設定します。

  • ALL: アカウントに付与されているすべてのロールにデフォルトを設定します。

  • role [, role ] ...: デフォルトを名前付きロールに設定します。このロールは、ALTER USER ... DEFAULT ROLE の実行時に存在し、アカウントに付与される必要があります。

ALTER USER SSL/TLS オプション

MySQL では、ユーザー名と資格証明に基づく通常の認証に加えて、X.509 証明書属性をチェックできます。 MySQL での SSL/TLS の使用に関する背景情報は、セクション6.3「暗号化された接続の使用」 を参照してください。

MySQL アカウントの SSL/TLS 関連オプションを指定するには、1 つ以上の tls_option 値を指定する REQUIRE 句を使用します。

REQUIRE オプションの順序は関係ありませんが、オプションを 2 回指定することはできません。 AND キーワードは、REQUIRE オプション間のオプションです。

ALTER USER では、次の tls_option 値が許可されます:

  • NONE

    ステートメントで指定されたすべてのアカウントに SSL または X.509 要件がないことを示します。 ユーザー名とパスワードが有効であれば、暗号化されていない接続が許可されます。 クライアントに適切な証明書および鍵ファイルがある場合は、クライアントオプションで暗号化された接続を使用できます。

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

    クライアントは、デフォルトでセキュアな接続を確立しようとします。 REQUIRE NONE を持つクライアントでは、セキュアな接続を確立できない場合、接続試行は暗号化されていない接続にフォールバックされます。 暗号化された接続を要求するには、クライアントは --ssl-mode=REQUIRED オプションのみを指定する必要があります。セキュアな接続を確立できない場合、接続の試行は失敗します。

  • SSL

    ステートメントで指定されたすべてのアカウントに対して暗号化された接続のみを許可するようにサーバーに指示します。

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

    クライアントは、デフォルトでセキュアな接続を確立しようとします。 REQUIRE SSL を持つアカウントでは、セキュアな接続を確立できない場合、接続の試行は失敗します。

  • X509

    ステートメントで指定されたすべてのアカウントについて、クライアントは有効な証明書を提示する必要がありますが、正確な証明書、発行者およびサブジェクトは関係ありません。 唯一の要件は、いずれかの CA 証明書でその署名を検証できるべきであるということです。 X.509 証明書の使用は常に暗号化を意味するため、この場合は SSL オプションは必要ありません。

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

    REQUIRE X509 のアカウントの場合、クライアントは接続する --ssl-key および --ssl-cert オプションを指定する必要があります。 (サーバーによって提供される公開証明書を検証できるように、--ssl-ca も指定することをお薦めしますが、必須ではありません。) これらの REQUIRE オプションは X509 の要件を意味するため、これは ISSUER および SUBJECT にも当てはまります。

  • ISSUER 'issuer'

    ステートメントで指定されたすべてのアカウントについて、CA 'issuer'によって発行された有効な X.509 証明書をクライアントが提示する必要があります。 クライアントが有効だが発行者が異なる証明書を提示した場合、サーバーは接続を拒否します。 X.509 証明書の使用は常に暗号化を意味するため、この場合は SSL オプションは必要ありません。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/emailAddress=ca@example.com';

    ISSUER には X509 の要件があるため、クライアントは接続するために --ssl-key および --ssl-cert オプションを指定する必要があります。 (サーバーによって提供される公開証明書を検証できるように、--ssl-ca も指定することをお薦めしますが、必須ではありません。)

  • SUBJECT 'subject'

    ステートメントで指定されたすべてのアカウントについて、クライアントがサブジェクト subject を含む有効な X.509 証明書を提示する必要があります。 クライアントが有効だがサブジェクトが異なる証明書を提示した場合、サーバーは接続を拒否します。 X.509 証明書の使用は常に暗号化を意味するため、この場合は SSL オプションは必要ありません。

    ALTER USER 'jeffrey'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/emailAddress=client@example.com';

    MySQL では、'subject'値と証明書の値との単純な文字列比較が行われるため、大文字と小文字およびコンポーネントの順序は、証明書に存在するものとまったく同じにする必要があります。

    SUBJECT には X509 の要件があるため、クライアントは接続するために --ssl-key および --ssl-cert オプションを指定する必要があります。 (サーバーによって提供される公開証明書を検証できるように、--ssl-ca も指定することをお薦めしますが、必須ではありません。)

  • CIPHER 'cipher'

    ステートメントで指定されたすべてのアカウントには、接続を暗号化するための特定の暗号メソッドが必要です。 このオプションは、十分な強度の暗号およびキー長が使用されるようにするために必要です。 短い暗号化キーを使用する古いアルゴリズムを使用すると、暗号化が弱くなる可能性があります。

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

SUBJECTISSUER および CIPHER オプションは、REQUIRE 句で組み合せることができます:

ALTER USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/emailAddress=client@example.com'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/emailAddress=ca@example.com'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
ALTER USER リソース制限オプション

セクション6.2.20「アカウントリソース制限の設定」 で説明されているように、アカウントによるサーバーリソースの使用に制限を設定できます。 そのためには、1 つ以上の resource_option 値を指定する WITH 句を使用します。

WITH オプションの順序は重要ではありませんが、特定のリソース制限が複数回指定された場合は、最後のインスタンスが優先されます。

ALTER USER では、次の resource_option 値が許可されます:

  • MAX_QUERIES_PER_HOUR count, MAX_UPDATES_PER_HOUR count, MAX_CONNECTIONS_PER_HOUR count

    ステートメントで指定されたすべてのアカウントについて、これらのオプションは、特定の 1 時間の間に各アカウントに許可されるクエリー、更新、およびサーバーへの接続の数を制限します。 count0 (デフォルト) である場合、これは、このアカウントに対する制限が存在しないことを示します。

  • MAX_USER_CONNECTIONS count

    ステートメントで指定されたすべてのアカウントについて、各アカウントによるサーバーへの同時接続の最大数を制限します。 0 以外の count は、このアカウントに対する制限を明示的に指定します。 count0 (デフォルト) である場合、サーバーは、max_user_connections システム変数のグローバル値からこのアカウントの同時接続の数を決定します。 max_user_connections もゼロである場合は、アカウントに制限がありません。

例:

ALTER USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
ALTER USER のパスワード管理オプション

ALTER USER では、パスワード管理用にいくつかの password_option 値がサポートされています:

  • パスワードの有効期限オプション: アカウントパスワードを手動で期限切れにし、そのパスワード有効期限ポリシーを設定できます。 ポリシーオプションによってパスワードが期限切れになることはありません。 代わりに、最新のアカウントパスワード変更の日時から評価されるパスワード有効期限に基づいて、サーバーがアカウントに自動期限切れを適用する方法を決定します。

  • パスワード再利用オプション: パスワードの再利用は、パスワード変更の数、経過時間、またはその両方に基づいて制限できます。

  • パスワード検証必須オプション: 変更しようとしているユーザーが実際に現在のパスワードを認識していることを確認するために、アカウントパスワードの変更を試行する際に現在のパスワードを指定する必要があるかどうかを指定できます。

  • 不正解 - パスワード失敗 - ログイントラッキングオプション: サーバーが失敗したログイン試行を追跡し、連続して正しくないパスワードが多すぎるアカウントを一時的にロックするようにすることができます。 必要な失敗数とロック時間は構成可能です。

このセクションでは、パスワード管理オプションの構文について説明します。 パスワード管理のポリシーの確立の詳細は、セクション6.2.15「パスワード管理」 を参照してください。

特定のタイプの複数のパスワード管理オプションが指定されている場合は、最後のオプションが優先されます。 たとえば、PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVERPASSWORD EXPIRE NEVER と同じです。

注記

失敗したログイン追跡に関連するオプションを除き、パスワード管理オプションは、資格証明を MySQL に内部的に格納する認証プラグインを使用するアカウントにのみ適用されます。 MySQL の外部にある資格証明システムに対して認証を実行するプラグインを使用するアカウントの場合、パスワード管理もそのシステムに対して外部で処理する必要があります。 内部資格証明記憶域の詳細は、セクション6.2.15「パスワード管理」 を参照してください。

アカウントパスワードが手動で期限切れになった場合、または自動期限切れポリシーに従ってパスワードの有効期間が許可された存続期間を超えたとみなされた場合、クライアントには期限切れのパスワードがあります。 この場合、サーバーはクライアントを切断するか、クライアントに許可されている操作を制限します (セクション6.2.16「期限切れパスワードのサーバー処理」 を参照)。 制限付きクライアントによって実行される操作は、ユーザーが新しいアカウントパスワードを確立するまでエラーになります。

注記

期限切れのパスワードは、現在の値に設定することで reset で使用できますが、適切なポリシーとして、別のパスワードを選択することをお薦めします。 DBA は、適切なパスワード再利用ポリシーを確立することで、非キューを強制できます。 パスワード再利用ポリシーを参照してください。

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 では、必要な最小パスワード変更数に基づいて以前のパスワードの再利用を制御するために、次の password_option 値が許可されています:

  • PASSWORD HISTORY DEFAULT

    password_history システム変数で指定された変更数の前にパスワードの再利用を禁止するために、パスワード履歴の長さに関するグローバルポリシーが適用されるように、ステートメントで指定されたすべてのアカウントを設定します。

    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
  • PASSWORD HISTORY N

    この履歴長オプションは、ステートメントで指定されたすべてのアカウントのグローバルポリシーをオーバーライドします。 それぞれについて、最近選択した N パスワードの再利用を禁止するために、パスワード履歴の長さを N パスワードに設定します。 次のステートメントは、以前の 6 つのパスワードの再利用を禁止します:

    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 6;

ALTER USER では、経過時間に基づいて以前のパスワードの再利用を制御するために、次の password_option 値が許可されます:

  • PASSWORD REUSE INTERVAL DEFAULT

    経過時間に関するグローバルポリシーが適用され、password_reuse_interval システム変数で指定された日数よりも新しいパスワードの再利用が禁止されるように、アカウントで指定されたすべてのステートメントを設定します。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
  • PASSWORD REUSE INTERVAL N DAY

    この time-elapsed オプションは、ステートメントで指定されたすべてのアカウントのグローバルポリシーをオーバーライドします。 それぞれについて、パスワードの再利用間隔を N 日に設定して、その日数より新しいパスワードの再利用を禁止します。 次のステートメントは、360 日間のパスワードの再利用を禁止します:

    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;

ALTER USER では、アカウントパスワードの変更の試行で現在のパスワードを指定する必要があるかどうかを制御するために、変更しようとしているユーザーが実際に現在のパスワードを知っていることを確認するために、次の password_option 値を許可しています:

  • PASSWORD REQUIRE CURRENT

    この検証オプションは、ステートメントで指定されたすべてのアカウントのグローバルポリシーをオーバーライドします。 それぞれについて、パスワードの変更で現在のパスワードを指定する必要があります。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
  • PASSWORD REQUIRE CURRENT OPTIONAL

    この検証オプションは、ステートメントで指定されたすべてのアカウントのグローバルポリシーをオーバーライドします。 それぞれについて、パスワードを変更して現在のパスワードを指定する必要はありません。 (現在のパスワードを指定する必要はありますが、指定する必要はありません。)

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
  • PASSWORD REQUIRE CURRENT DEFAULT

    password_require_current システム変数で指定されたパスワード検証に関するグローバルポリシーが適用されるように、アカウントで指定されたすべてのステートメントを設定します。

    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;

MySQL 8.0.19 の時点で、ALTER USER は、失敗したログイン追跡を制御するために次の password_option 値を許可します:

  • FAILED_LOGIN_ATTEMPTS N

    不正なパスワードを指定するアカウントログイン試行を追跡するかどうか。 N は 0 から 32767 の数値である必要があります。 値 0 を指定すると、失敗したログイントラッキングが無効になります。 0 より大きい値は、パスワードが何回連続して失敗したために一時アカウントがロックされるかを示します (PASSWORD_LOCK_TIME もゼロ以外の場合)。

  • PASSWORD_LOCK_TIME {N | UNBOUNDED}

    連続して何度もログインを試行した後にアカウントをロックする期間。パスワードが正しくありません。 N は、0 から 32767 の数値、または UNBOUNDED である必要があります。 値 0 を指定すると、一時アカウントロックが無効になります。 0 より大きい値は、アカウントをロックする期間を日数で示します。 値が UNBOUNDED の場合、アカウントのロック期間は無制限になります。ロックされると、アカウントはロック解除されるまでロック状態のままになります。 ロック解除が発生する条件の詳細は、失敗したログイントラッキングと一時アカウントロック を参照してください。

ログイン失敗トラッキングと一時ロックを実行するには、アカウントの FAILED_LOGIN_ATTEMPTS オプションと PASSWORD_LOCK_TIME オプションの両方をゼロ以外にする必要があります。 次のステートメントは、パスワードが 4 回連続して失敗した後も 2 日間ロックされたままになるようにアカウントを変更します:

ALTER USER 'jeffrey'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
ALTER USER アカウントロックオプション

MySQL では、アカウントのロック状態を指定する ACCOUNT LOCK および ACCOUNT UNLOCK オプションを使用したアカウントのロックおよびロック解除がサポートされています。 詳細は、セクション6.2.19「アカウントロック」を参照してください。

複数の account-locking オプションが指定されている場合は、最後のオプションが優先されます。

MySQL 8.0.19 の時点では、ログインの失敗回数が多すぎるために一時的にロックされているステートメントで指定されたアカウントは、ALTER USER ... UNLOCK によってロック解除されます。 セクション6.2.15「パスワード管理」を参照してください。

ALTER USER バイナリロギング

ALTER USER は、成功した場合はバイナリログに書き込まれますが、失敗した場合は書き込まれません。その場合、ロールバックが発生し、変更は行われません。 バイナリログに書き込まれるステートメントには、指定されたすべてのユーザーが含まれます。 IF EXISTS 句が指定されている場合、これには存在せず、変更されなかったユーザーも含まれます。

元のステートメントがユーザーの資格を変更した場合、バイナリログに書き込まれるステートメントは、そのユーザーに適用可能な認証プラグインを次のように指定します:

  • 元のステートメントで指定されたプラグイン (指定されている場合)。

  • それ以外の場合は、ユーザーアカウントに関連付けられたプラグイン (ユーザーが存在する場合)、またはデフォルトの認証プラグイン (ユーザーが存在しない場合)。 (バイナリログに書き込まれたステートメントがユーザーの特定の認証プラグインを指定する必要がある場合は、それを元のステートメントに含めます。)

サーバーは、バイナリログに書き込まれたステートメント内の任意のユーザーのデフォルトの認証プラグインを追加すると、それらのユーザーを指定する警告をエラーログに書き込みます。

元のステートメントで FAILED_LOGIN_ATTEMPTS または PASSWORD_LOCK_TIME オプションが指定されている場合、バイナリログに書き込まれるステートメントにはそのオプションが含まれます。


関連キーワード:  ステートメント, パスワード, アカウント, PASSWORD, auth, ユーザー, 認証, 変更, 接続, jeffrey