Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

13.7.1.3 CREATE USER ステートメント

CREATE USER [IF NOT EXISTS]
    user [auth_option] [, user [auth_option]] ...
    DEFAULT ROLE role [, role ] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...
    [COMMENT 'comment_string' | ATTRIBUTE 'json_object']

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

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
  | 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 [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
}

CREATE USER ステートメントは、新しい MySQL アカウントを作成します。 これにより、認証、ロール、SSL/TLS、リソース制限およびパスワード管理プロパティを新しいアカウントに対して確立できます。 また、アカウントを最初にロックするかロック解除するかも制御します。

CREATE USER を使用するには、mysql システムスキーマに対するグローバル CREATE USER 権限または INSERT 権限が必要です。 read_only システム変数が有効になっている場合、CREATE USER にはさらに CONNECTION_ADMIN 権限 (または非推奨の SUPER 権限) が必要です。

MySQL 8.0.22 では、作成するアカウントの名前がストアドオブジェクトの DEFINER 属性として指定されている場合、CREATE USER はエラーで失敗します。 (つまり、アカウントを作成すると、アカウントが現在孤立しているストアドオブジェクトを採用する場合、ステートメントは失敗します。) 操作を実行するには、SET_USER_ID 権限が必要です。この場合、ステートメントはエラーで失敗するのではなく、警告付きで成功します。 SET_USER_ID がない場合、ユーザー作成操作を実行するには、孤立したオブジェクトを削除し、アカウントを作成してその権限を付与してから、削除したオブジェクトを再作成します。 特定のアカウントを DEFINER 属性として指定するオブジェクトの識別方法などの追加情報は、孤立したストアドオブジェクト を参照してください。

CREATE USER は、指定されたすべてのユーザーに対して成功するか、ロールバックされ、エラーが発生しても効果はありません。 デフォルトでは、すでに存在するユーザーを作成しようとするとエラーが発生します。 IF NOT EXISTS 句が指定されている場合、ステートメントは、エラーではなく、すでに存在する名前付きユーザーごとに警告を生成します。

重要

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

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

CREATE USER の概要

CREATE USER では、アカウントごとに mysql.user システムテーブルに新しい行が作成されます。 アカウント行には、ステートメントで指定されたプロパティが反映されます。 未指定のプロパティはデフォルト値に設定されます:

  • 認証: default_authentication_plugin システム変数で定義された認証プラグインと空の資格証明

  • デフォルトロール: NONE

  • SSL/TLS: NONE

  • リソース制限: 無制限

  • パスワード管理: PASSWORD EXPIRE DEFAULT PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT。ログイン失敗トラッキングおよび一時アカウントロックは無効です

  • アカウントのロック: ACCOUNT UNLOCK

最初に作成されたアカウントには権限がなく、NONE のデフォルトロールがあります。 権限またはロールを割り当てるには、GRANT ステートメントを使用します。

各アカウント名には、セクション6.2.4「アカウント名の指定」で説明されている形式が使用されます。 例:

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

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

アカウントを指定する各 user 値の後に、アカウントの認証方法を示すオプションの auth_option 値を続けることができます。 これらの値を使用すると、アカウント認証プラグインおよび資格証明 (パスワードなど) を指定できます。 各 auth_option 値は、直前に指定されたアカウントにのみを適用します。

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

例: デフォルトの認証プラグインと指定されたパスワードを使用するアカウントを作成します。 ユーザーがサーバーへの最初の接続時に新しいパスワードを選択する必要があるように、パスワードを期限切れとしてマークします:

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

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

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

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

CREATE USER
  'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password
                                   BY 'new_password1',
  'jeanne'@'localhost' IDENTIFIED WITH caching_sha2_password
                                  BY 'new_password2'
  REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60
  PASSWORD HISTORY 5
  ACCOUNT LOCK;

auth_option 値 (この場合は IDENTIFIED WITH ... BY) は、直前に指定されたアカウントにのみ適用されるため、各アカウントはすぐ後の認証プラグインおよびパスワードを使用します。

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

  • 有効な X.509 証明書を使用して接続する必要があります。

  • 1 時間あたり最大 60 個のクエリーが許可されます。

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

  • アカウントは最初にロックされるため、実質的にはプレースホルダであり、管理者がロックを解除するまで使用できません。

MySQL 8.0.21 以降では、ここで説明するように、オプションでユーザーコメントまたはユーザー属性を持つユーザーを作成できます:

  • ユーザーコメント

    ユーザーコメントを設定するには、CREATE USER ステートメントに COMMENT 'user_comment'を追加します。ここで、user_comment はユーザーコメントのテキストです。

    例 (他のオプションは省略):

    CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
  • ユーザー属性

    ユーザー属性は、1 つ以上のキーと値のペアで構成される JSON オブジェクトで、ATTRIBUTE 'json_object'CREATE USER の一部として含めることによって設定されます。json_object は有効な JSON オブジェクトである必要があります。

    例 (他のオプションは省略):

    CREATE USER 'jim'@'localhost'
        ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}';

ユーザーコメントとユーザー属性は、INFORMATION_SCHEMA.USER_ATTRIBUTES テーブルの ATTRIBUTE カラムにまとめて格納されます。 このクエリーでは、ユーザー jin@localhost を作成するために示したステートメントによって挿入された次のテーブルの行が表示されます:

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->    WHERE USER = 'jim' AND HOST = 'localhost'\G
*************************** 1. row ***************************
     USER: jim
     HOST: localhost
ATTRIBUTE: {"fname": "James", "lname": "Scott", "phone": "123-456-7890"}
1 row in set (0.00 sec)

実際の COMMENT オプションは、キーとして comment のみを持ち、その値がオプションに指定された引数であるユーザー属性を設定するためのショートカットを提供します。 これを確認するには、CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon'ステートメントを実行し、USER_ATTRIBUTES テーブルに挿入される行を確認します:

mysql> CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->    WHERE USER = 'jon' AND HOST = 'localhost';
+------+-----------+-------------------------------------------+
| USER | HOST      | ATTRIBUTE                                 |
+------+-----------+-------------------------------------------+
| jon  | localhost | {"comment": "Some information about Jon"} |
+------+-----------+-------------------------------------------+
1 row in set (0.00 sec)

COMMENTATTRIBUTE を同じ CREATE USER ステートメントで一緒に使用することはできません。使用しようとすると、構文エラーが発生します。 ユーザー属性の設定と同時にユーザーコメントを設定するには、次のように ATTRIBUTE を使用して、その引数に comment キーを持つ値を含めます:

mysql> CREATE USER 'bill'@'localhost'
    ->        ATTRIBUTE '{"fname":"William", "lname":"Schmidt",
    ->        "comment":"Website developer"}';
Query OK, 0 rows affected (0.16 sec)

ATTRIBUTE 行のコンテンツは JSON オブジェクトであるため、次に示すように、適切な MySQL JSON 関数または演算子を使用して操作できます:

mysql> SELECT
    ->   USER AS User,
    ->   HOST AS Host,
    ->   CONCAT(ATTRIBUTE->>"$.fname"," ",ATTRIBUTE->>"$.lname") AS 'Full Name',
    ->   ATTRIBUTE->>"$.comment" AS Comment
    -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    -> WHERE USER='bill' AND HOST='localhost';
+------+-----------+-----------------+-------------------+
| User | Host      | Full Name       | Comment           |
+------+-----------+-----------------+-------------------+
| bill | localhost | William Schmidt | Website developer |
+------+-----------+-----------------+-------------------+
1 row in set (0.00 sec)

既存のユーザーのユーザーコメントまたはユーザー属性を設定または変更するには、ALTER USER ステートメントで COMMENT または ATTRIBUTE オプションを使用できます。

ユーザーコメントとユーザー属性は単一の JSON カラムに内部的にまとめて格納されるため、これにより、最大結合サイズの上限が設定されます。詳細は、JSON 記憶域の要件 を参照してください。

詳細および例は、情報スキーマ USER_ATTRIBUTES テーブルの説明も参照してください。

CREATE USER 認証オプション

アカウント名の後に、アカウント認証プラグインまたは資格証明 (あるいはその両方) を指定する auth_option 認証オプションを続けることができます。

注記

ランダムパスワード生成の句は、資格証明を 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 システムテーブルにそのまま格納されます。

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

  • IDENTIFIED BY 'auth_string'

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

  • IDENTIFIED BY RANDOM PASSWORD

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

  • IDENTIFIED WITH auth_plugin

    アカウント認証プラグインを auth_plugin に設定し、資格証明を空の文字列にクリアして、その結果を mysql.user システムテーブルのアカウント行に格納します。

  • IDENTIFIED WITH auth_plugin BY 'auth_string'

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

  • IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD

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

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

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

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

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

例: 認証プラグインをクリアテキストのパスワード値とともに指定します:

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

いずれの場合も、アカウント行に格納されるパスワード値は、アカウントに関連付けられた認証プラグインによってハッシュされたあとのクリアテキスト値'password'です。

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

CREATE USER ロールのオプション

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

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

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

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

DEFAULT ROLE 句では、カンマ区切りのロール名のリストを使用できます。 これらのロールは、CREATE USER の実行時に存在する必要はありません。

CREATE USER SSL/TLS オプション

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

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

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

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

  • NONE

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

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

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

    SSL 関連の REQUIRE オプションが指定されていない場合、NONE がデフォルトです。

  • SSL

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

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

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

  • X509

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

    CREATE 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 オプションは必要ありません。

    CREATE 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 オプションは必要ありません。

    CREATE 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'

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

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

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

CREATE 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';
CREATE USER リソース制限オプション

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

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

CREATE 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 もゼロである場合は、アカウントに制限がありません。

例:

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

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

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

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

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

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

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

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

注記

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

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

CREATE USER では、パスワードの有効期限を制御するために次の password_option 値が許可されます:

  • PASSWORD EXPIRE

    ステートメントで指定されたすべてのアカウントのパスワードをすぐに期限切れとしてマークします。

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

    default_password_lifetime システム変数で指定されたグローバル有効期限ポリシーが適用されるように、ステートメントで指定されたすべてのアカウントを設定します。

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

    この有効期限オプションは、ステートメントで指定されたすべてのアカウントのグローバルポリシーをオーバーライドします。 それぞれについて、パスワードの有効期限が切れないようにパスワードの有効期限を無効にします。

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

    この有効期限オプションは、ステートメントで指定されたすべてのアカウントのグローバルポリシーをオーバーライドします。 それぞれについて、パスワードの存続期間が N 日に設定されます。 次のステートメントでは、180 日ごとにパスワードを変更する必要があります:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;

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

  • PASSWORD HISTORY DEFAULT

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

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

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

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

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

  • PASSWORD REUSE INTERVAL DEFAULT

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

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

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

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

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

  • PASSWORD REQUIRE CURRENT

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

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

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

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

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

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

MySQL 8.0.19 の時点で、CREATE 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 日間ロックされたままになるアカウントを作成します:

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

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

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

CREATE USER バイナリロギング

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

バイナリログに書き込まれるステートメントは、次のように決定される各ユーザーの認証プラグインを指定します:

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

  • それ以外の場合は、デフォルトの認証プラグイン。 特に、ユーザー u1 がすでに存在し、デフォルト以外の認証プラグインを使用している場合、CREATE USER IF NOT EXISTS u1 のバイナリログに書き込まれるステートメントはデフォルトの認証プラグインに名前を付けます。 (バイナリログに書き込まれたステートメントがユーザーのデフォルト以外の認証プラグインを指定する必要がある場合は、それを元のステートメントに含めます。)

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

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