アカウント管理ステートメント

1. CREATE USER 構文
2. DROP USER 構文
3. GRANT 構文
4. RENAME USER 構文
5. REVOKE 構文
6. SET PASSWORD 構文

MySQL アカウント情報は mysql データベースのテーブルに格納されています。このデータベースとアクセス コントロール システムについては 章 4. データベース管理 で詳しく説明されていますので、更なる詳細についてはこれを参照して下さい。

重要:MySQL のいくつかのリリース版は、新しい権限や特徴を追加する為に供与テーブルの構造の変更を紹介しています。MySQL の新しいバージョンを更新する時はいつでも、新しい機能を有効に利用できるようにする為に、供与テーブルを最新の構造に更新しなければいけません。詳しくは 項 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 を参照してください。

MySQL Enterprise 製造環境では、ユーザ アカウントへの変更を慎重に分析する事が大切です。MySQL ネットワーク モニタリングとアドバイス サービス はユーザの権限が変更される度にそれを通知します。追加情報については http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。

1. CREATE USER 構文

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
    [, user [IDENTIFIED BY [PASSWORD] 'password']] ...

CREATE USER ステートメントは新しい MySQL アカウントを作成します。それを利用する為には、mysql データベースにグローバル CREATE USER 権限か INSERT 権限を持つ必要があります。それぞれのアカウントに対して、CREATE USER は権限を持たない mysql.user テーブル内に新しい行を作成します。もしアカウントが既に存在すると、エラーが発生します。各アカウントは、例えば、'jeffrey'@'localhost' のように GRANT ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%' 部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT 構文」 を参照してください。

アカウントには、任意の IDENTIFIED BY 条項を利用してパスワードを与える事ができます。user 値とパスワードは、GRANT ステートメントと同じ方法で与える事ができます。特に、プレーン テキスト内でパスワードを指定するには、PASSWORD キーワードを省略してください。パスワードを、PASSWORD() 関数によって返されたようにハッシュ化された値として指定するには、PASSWORD キーワードを含んでください。詳しくは 項3. 「GRANT 構文」 を参照してください。

2. DROP USER 構文

DROP USER user [, user] ...

DROP USER ステートメントは1つ、または複数の MySQL アカウントを削除します。それは、全ての供与テーブルからアカウントの権限行を削除します。このステートメントを利用する為には、mysql データベースにグローバル CREATE USER 権限か DELETE 権限を持つ必要があります。各アカウントは、例えば、'jeffrey'@'localhost' のように GRANT ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%' 部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT 構文」 を参照してください。

DROP USER を利用すると、アカウントとその権限を次のように削除する事ができます。

DROP USER user;

重要:DROP USER は自動的にユーザ セッションを閉じません。それよりも、オープン セッションを持つユーザがドロップした時には、そのユーザのセッションが閉じられるまでそのステートメントは効果を発揮しません。一度セッションが閉じられると、そのユーザはドロップされ、そのユーザが次にログインしようとすると失敗します。これには意図があります。

DROP USER は、ユーザが作成したデータベース オブジェクトを自動的に削除したり、無効にしたりしません。これは、テーブル、ビュー、ストアド ルーチン、トリガ、そしてイベントに適応します。

3. GRANT 構文

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER 'cipher' [AND]]
        [ISSUER 'issuer' [AND]]
        [SUBJECT 'subject']]
    [WITH with_option [with_option] ...]

object_type =
    TABLE
  | FUNCTION
  | PROCEDURE

with_option =
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

GRANT ステートメントは、システム管理者が MySQL ユーザ アカウントを作成し、アカウントに権利を与える事を可能にします。GRANT を利用する為には、GRANT OPTION 権限を持ち、また自分が供与している権限を持つ必要があります。REVOKE ステートメントは、アカウント管理者が権限を削除する事に関連し、それを可能にします。詳しくは 項5. 「REVOKE 構文」 を参照してください。

MySQL アカウント情報は mysql データベースのテーブルに格納されています。このデータベースとアクセス コントロール システムについては 章 4. データベース管理 で詳しく説明されていますので、更なる詳細についてはこれを参照して下さい。

重要:MySQL のいくつかのリリース版は、新しい権限や特徴を追加する為に供与テーブルの構造の変更を紹介しています。MySQL の新しいバージョンを更新する時はいつでも、新しい機能を有効に利用できるようにする為に、供与テーブルを最新の構造に更新しなければいけません。詳しくは 項 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 を参照してください。

もし供与テーブルが、大文字と小文字が混在するデータベースかテーブル名を含む権限行を保持し、lower_case_table_names システム変数がゼロではない値に設定されたら、REVOKE をこれらの権限を廃止する為に利用する事はできません。供与テーブルを直接コントロールする必要があるかも知れません。(GRANTlower_case_table_names が設定された時にそのような行を作成しませんが、そのような行は変数を設定する前に作成されていた可能性があります。)

権限はいくつかのレベルで供与する事ができます:

  • グローバル レベル

    既存サーバ上では、グローバル権限は全てのデータベースに適応します。これらの権限は mysql.user テーブル内に格納されています。GRANT ALL ON *.*REVOKE ALL ON *.* はグローバル権限だけを供与、廃止します。

  • データベース レベル

    データベース権限は既存データベース内の全てのオブジェクトに適応します。これらの権限は mysql.dbmysql.host テーブル内に格納されています。GRANT ALL ON db_name.*REVOKE ALL ON db_name.* はグローバル権限だけを供与、廃止します。

  • テーブル レベル

    テーブル権限は既存テーブル内の全てのカラムに適応します。これらの権限は mysql.tables_priv テーブル内に格納されています。GRANT ALL ON db_name.tbl_nameREVOKE ALL ON db_name.tbl_name はグローバル権限だけを供与、廃止します。

  • カラム レベル

    カラム権限は既存テーブル内の単一カラムに適応します。これらの権限は mysql.columns_priv テーブル内に格納されています。REVOKE を利用している時は、供与されたカラムと同じカラムを指定する必要があります。

  • ルーチン レベル

    CREATE ROUTINEALTER ROUTINEEXECUTE、そして GRANT 権限はストアド ルーチンに適応します。(ファンクションとプロシージャ)それらは、グローバルとデータベース レベルで供与されます。また、CREATE ROUTINE 以外は、これらの権限は各ルーチンに対してルーチン レベルで供与する事ができ、mysql.procs_priv テーブル内で格納されます。

object_type 条項は、次のオブジェクトがテーブル、ストアド ファンクション、またはストアド ルーチンの時には TABLEFUNCTION、または PROCEDURE 条項として指定されなければいけません。

GRANTREVOKE ステートメントに対しては、priv_type は次の表にある物として指定する事ができます。

権限 意味
ALL [PRIVILEGES] GRANT OPTION 以外の全てのシンプルな権限を設定します。
ALTER ALTER TABLE の使用を可能にします。
ALTER ROUTINE ストアド ルーチンの変更、ドロップを可能にします。
CREATE CREATE TABLE の使用を可能にします。
CREATE ROUTINE ストアド ルーチンの作成を可能にします。
CREATE TEMPORARY TABLES CREATE TEMPORARY TABLE の使用を可能にします。
CREATE USER CREATE USERDROP USERRENAME USER、そして REVOKE ALL PRIVILEGES の使用を可能にします。
CREATE VIEW CREATE VIEW の使用を可能にします。
DELETE DELETE の使用を可能にします。
DROP DROP TABLE の使用を可能にします。
EVENT イベントスケジューラがイベントを作成するのを可能にします。
EXECUTE ユーザがストアドルーチンを起動させるのを可能にします。
FILE SELECT ... INTO OUTFILELOAD DATA INFILE の使用を可能にします。
INDEX CREATE INDEXDROP INDEX の使用を可能にします。
INSERT INSERTの使用を可能にします。
LOCK TABLES SELECT 権限を持つテーブル上の LOCK TABLES の使用を可能にします。
PROCESS SHOW FULL PROCESSLIST の使用を可能にします。
REFERENCES インプリメントされていません。
RELOAD FLUSH の使用を可能にします。
REPLICATION CLIENT ユーザがスレーブとマスタの場所を問い合わせる事を可能にします。
REPLICATION SLAVE 複製スレーブが必要とします。 (マスタからバイナリ ログ イベントを読み込む為)
SELECT SELECT の使用を可能にします。
SHOW DATABASES SHOW DATABASES は全てのデータベースを表示します。
SHOW VIEW SHOW CREATE VIEWの使用を可能にします。
SHUTDOWN mysqladmin shutdown の使用を可能にします。
SUPER CHANGE MASTERKILLPURGE MASTER LOGS、そして SET GLOBAL ステートメントの使用を可能にし、 the mysqladmin debug コマンドはmax_connections が達成していても接続を (一回) 許可します。
TRIGGER ユーザがトリガを作成、ドロップするのを可能にします。
UPDATE UPDATE の使用を可能にします。
USAGE 権限が無い」 の同義語です。
GRANT OPTION 権限を与えるのを可能にします。

EVENTTRIGGER 権限は MySQL 5.1.6 で追加されました。 トリガはテーブルと関連しているので、トリガを作成したり、ドロップしたりするには、トリガではなくテーブルに TRIGGER 権限を持つ必要あります。(MySQL 5.1.6 以前では SUPER 権限はトリガを作成したりドロップしたりする為に必要でした。)

REFERENCES 権限は現在は利用されていません。

USAGE は、権限を持たないユーザを作成した時に指定する事ができます。

アカウントがどんな権限を持つのかを決定する為には SHOW GRANTS を利用してください。詳しくは 項16. 「SHOW GRANTS 構文」 を参照してください。

ON *.* 構文を利用してグローバル権限を、または、ON db_name.* 構文を利用してデータベース権限を割り当てる事ができます。もし ON * を指定し、デフォルト データベースを選択したら、権限はそのデータベース内に供与されます。(警告: もし ON * を指定し、デフォルト データベースを選択 しなければ 、供与される権限はグローバルになります。

FILEPROCESSRELOADREPLICATION CLIENTREPLICATION SLAVESHOW DATABASESSHUTDOWN、そして SUPER 権限は、グローバルとしてのみ供与される(ON *.* 構文を利用して)管理権限です。

その他の権限は、グローバルに、またはより特定なレベルで供与する事ができます。

テーブルに指定できる priv_type 値は、SELECTINSERTUPDATEDELETECREATEDROPGRANT OPTIONINDEXALTERCREATE VIEWSHOW VIEW そして TRIGGER です。

カラムに指定できる priv_type 値は (column_list 条項を利用する時)、SELECTINSERT、そして UPDATE です。

ルーチン レベルで指定できる priv_type 値は ALTER ROUTINEEXECUTE、そして GRANT OPTION です。CREATE ROUTINE は、最初にルーチンを作成する時にこの権限を持たなければいけないので、ルーチン レベル権限ではありません。

GRANT ALL は、与えようとしているレベルに存在する権限のみをグローバル、データベース、テーブル、そしてルーチン レベルに対して割り当てます。例えば、GRANT ALL ON db_name.* はデータベース レベル ステートメントなので、 FILE のようなグローバルのみの権限は供与しません。

MySQL は、存在しないデータベース オブジェクト上にも権限を与える事を許容します。そのような場合、供与される権限は CREATE 権限を含む必要があります。この動作は意図的であり、また後で作成されるデータベース オブジェクトに対するユーザ アカウントと権限を、データベース管理者が準備する事を可能にします。

重要:MySQL は、テーブルやデータベースをドロップする時に、自動的に権限を廃止しません。しかし、もしルーチンをドロップすると、そのルーチンに供与された全てのルーチン レベル権限は廃止されます。

注意:‘_’ と ‘%’ ワイルドカードは、権限をグローバル、またはデータベース レベルで供与する GRANT ステートメント内でデータベース名を指定する時に許容されます。 これは例えば、データベース名の一部として ‘_’ 文字を利用したければ、ワイルドカードのパターンに一致する追加データベースにアクセスする事を不可能にする為に、GRANT ステートメント内でこれを ‘\_’ として指定必要がるという事を意味します。例えば、GRANT ... ON `foo\_bar`.* TO ... のようになります。

任意ホストからユーザに供与権を適応させる為に、MySQL は user_name@host_name の形で user 値を指定する事をサポートします。もし user_namehost_name 値が引用されていない識別子として正当であれば、それを引用する必要はありません。しかし、引用句は特別な文字(‘-’ 等のような)を含む user_name 文字列、または特別な文字やワイルドカード文字(‘%’ 等のような)を含む host_name 文字列を指定するのに必要です。例えば、'test-user'@'test-hostname' のようになります。ユーザ名とホスト名を別々に引用してください。

ホスト名の中でワイルドカードを指定する事ができます。例えば、user_name@'%.loc.gov' は、loc.gov ドメイン内のどのホストに対しても user_name に適応し、user_name@'%'144.155.166 クラス C サブネット内のどのホストに対しても、user_name に適応します。

シンプルな形 user_name は、user_name@'%' の同義語です。

MySQL はユーザ名内でワイルドカードをサポートしません。.匿名のユーザは、User='' を持つエントリを mysql.user テーブル内に挿入する事、または GRANT を利用してユーザを空の名前で作成する事で定義されます。

GRANT ALL ON test.* TO ''@'localhost' ...

引用された値、引用データベース、テーブル、カラム、そしてルーチン名を識別子として指定する時は、バッククォートを利用しています。(‘`’)ホスト名、ユーザ名、そしてパスワードを文字列として、単一引用句(‘'’)を利用して引用してください。

警告:匿名ユーザが MySQL サーバに接続する事を許可するなら、全てのローカル ユーザにも user_name@localhost として権限を供与する必要があります。そうでなければ、名づけられたユーザがローカル マシンから MySQL サーバにログインしようとした時に、mysql.user テーブル内(MySQL インストールの最中に作成された物)の localhost の匿名ユーザ アカウントが利用されます。 詳細に関しては 項 「アクセス制御の段階 1: 接続確認」 を参照して下さい。

匿名ユーザをリスト アップしてある次のクエリを実行する事によって、これが当てはまるかどうかを決定する事ができます。

SELECT Host, User FROM mysql.user WHERE User='';

もし先ほど説明した問題を防ぐ為に、ローカル匿名ユーザ アカウントを削除したければ、次のステートメントを利用してください。

DELETE FROM mysql.user WHERE Host='localhost' AND User='';
FLUSH PRIVILEGES;

GRANT は最大60文字のホスト名をサポートします。データベース、テーブル、カラム、そしてルーチン名は最大64文字です。ユーザ名は最大16文字です。注意:ユーザ名の許容長さは、mysql.user テーブルを変更しても変える事はできません。もしそれをすると、ユーザが MySQL サーバにログインできなくなってしまうような、予想不可能な動作に陥る可能性があります。項 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 に説明のある、MySQL AB で規定されている方法を利用する以外は、mysql データベース内のテーブルは、どんな方法でも絶対に変更してはいけません。

テーブル、カラム、ルーチンの権限は、各権限レベルの権限の論理的な OR として相加的に形成されています。例えば、もし mysql.user テーブルが、ユーザはグローバル SELECT 権限を持つ、と指定すると、その権限はデータベース、テーブル、またはカラムレベルのエントリによって否定する事はできません。

カラムの権限は次のように計算する事ができます。

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
OR routine privileges

ほとんどの場合、たった1つの権限レベルでユーザに対して権利を供与する為、実際にはこれほど複雑では有りません。権限チェックの方法の詳細については、項4.7. 「MySQL アクセス権限システム」 で紹介されています。

もし mysql.user テーブルに存在しないユーザ名/ホスト名の組み合わせに権限を供与するのであれば、エントリが追加されそれは DELETE ステートメントで削除されるまでそこに残ります。言い換えると、GRANTuser テーブル エントリを作成するかもしれませんが、REVOKE はそれらを削除しません。 従ってそれは DROP USERDELETE を明示的に利用して行わなければいけません。

警告:もし新しいユーザを作成して IDENTIFIED BY 条項を指定しないと、そのユーザはパスワードを持ちません。これはとても不安定です。しかし、新規ユーザに空ではないパスワードを提供する為に IDENTIFIED BY が与えられない限り、GRANT が新規ユーザを作成するのを防ぐ為に NO_AUTO_CREATE_USER SQL モードを有効にする事ができます。

MySQL Enterprise MySQL ネットワーク モニタリングとアドバイス サービスは、パスワードが無いユーザ アカウントを明確に防いでいます。更なる情報については、http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。

もし新規ユーザが作成されたり、グローバル供与権限を持っていたら、ユーザのパスワードは、IDENTIFIED BY 条項があればそれによって指定された物に設定されます。もしユーザが既にパスワードを持っていたら、それは新しい物と置き換えられます。

パスワードは SET PASSWORD ステートメントで設定する事もできます。詳しくは 項6. 「SET PASSWORD 構文」 を参照してください。

IDENTIFIED BY 条項内では、パスワードは直定数パスワード値でなければいけません。PASSWORD() 関数を SET PASSWORD ステートメントに対する時と同じように使用する必要はありません。例:

GRANT ... IDENTIFIED BY 'mypass';

もしパスワードを明確なテキストで送信したく無い場合、PASSWORD() がそのパスワードに返すハッシュ化された値が分かっていれば、キーワード PASSWORD の前にハッシュ化された値を指定する事ができます。

GRANT ...
IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';

C プログラムの中では、make_scrambled_password() C API 関数を利用する事で、ハッシュ化された値を得る事ができます。

もしデータベースに権限を供与すると、mysql.db テーブル内のエントリが必要に応じて作成されます。もしデータベースの全ての権限が REVOKE で削除されると、このエントリも削除されます。

SHOW DATABASES 権限は SHOW DATABASE ステートメントを発行する事によって、アカウントがデータベース名を見る事を可能にします。この権限を持たないアカウントは、それらが権限を持つデータベースだけを見て、また、もしサーバが --skip-show-database オプションでスタートされていれば、ステートメントを利用する事は全くできません。

MySQL Enterprise SHOW DATABASES 権限は、MySQL サーバ上で全てのデータベースを見る必要があるユーザにだけ与えられます。MySQL ネットワーク モニタリングとアドバイス サービスの読者は、サーバが --skip-show-database オプション無しでスタートされた時に変更されます。追加情報については http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。

もしユーザがテーブルに何の権限も持たなければ、ユーザがテーブルのリストを要求した時(例えば、SHOW TABLES ステートメントを利用して)テーブル名は表示されません。

WITH GRANT OPTION 条項は、ユーザが指定された権限レベルで持つ権限を、別のユーザに与える事ができる機能を与えます。異なる権限を持つ2つのユーザは権限を接合できる事があるので、どのユーザに GRANT OPTION 権限を与えるのか注意する必要があります。

自分が持たない権限を別のユーザに与える事はできません。GRANT OPTION 権限によって、自分が持つ権限を割り当てる機能のみ与えられます。

特定の権限レベルでユーザに GRANT OPTION 権限を与える時は、そのユーザがそのレベルで持つどんな権限も、(または将来与えられる物も)そのユーザから別のユーザに与える事ができるので、注意が必要です。ユーザにデータベース上で INSERT 権限を与えると仮定してください。その時もし SELECT 権限をデータベース上で与え、WITH GRANT OPTION を指定すると、そのユーザは別のユーザに SELECT 権限だけではなく INSERT も与える事ができます。その時もしデータベース上でユーザに UPDATE 権限を与えると、そのユーザは INSERTSELECT、そして UPDATE を与える事ができるようになります。

非管理者ユーザに対しては、ALTER 権限をグローバルに与えたり、またはそれを mysql データベースに与えたりするべきでは有りません。もしそれをしてしまうと、残りのテーブルによってそのユーザが権限システムを破壊する事が可能になってしまいます!

MAX_QUERIES_PER_HOUR countMAX_UPDATES_PER_HOUR count、そして MAX_CONNECTIONS_PER_HOUR count オプションは、1時間の間にユーザが行う事ができるクエリ、更新、そしてログインの数を制限します。(クエリ キャッシュから結果が与えられるクエリは MAX_QUERIES_PER_HOUR 制限に対してカウントしません。)もし count0 なら(デフォルト)、そのユーザには制限がないという意味になります。

MAX_USER_CONNECTIONS count オプションは、そのアカウントが作成する事ができる同時接続の最大数を制限します。もし count0 なら(デフォルト)、max_user_connections システム変数はそのアカウントの同時接続数を決定します。

注意:既存権限に影響を与えずに、既に存在するユーザにこれらのリソース制限オプションを指定するには、GRANT USAGE ON *.* ... WITH MAX_... を利用して下さい。

詳しくは 項 「ユーザ リソースの制限」 を参照してください。

MySQL は、ユーザ名とパスワードに基づいた通常認証に加え、X509 証明拡張子を確認する事ができます。 SSL 関連オプションを MySQL アカウントに指定するには GRANT ステートメントの REQUIRE 条項を利用してください。(MySQL を利用した SSL 利用の背景情報については、項 「接続安全」 を参照してください。)

与えられたアカウントの接続を制限するには、いくつかの異なる方法があります。

  • REQUIRE NONE は、アカウントが SSL や X509 要求を持たないという事を指示します。もし SSL 関連 REQUIRE オプションが指定されれば、これがデフォルトになります。もしユーザ名とパスワードが有効なら、暗号化されていない接続が許可されます。しかし、クライアントのオプションにより、もしそのクライアントが正しい証明とキー ファイルを持っていれば、暗号化された接続もまた利用できます。それは、クライアントは SSL コマンドオプションを指定する必要がなく、その場合接続は暗号化されていない物になる、という事です。暗号化された接続を利用するには、クライアントは --ssl-ca オプションか、または --ssl-ca--ssl-key、または --ssl-cert オプションの3つ全てを指定する必要があります。

  • REQUIRE SSL オプションは、サーバに対して、SSL 暗号化接続だけをアカウントに許容するよう指示を出します。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      IDENTIFIED BY 'goodsecret' REQUIRE SSL;

    接続するには、クライアントは --ssl-ca オプションを指定し、また追加で --ssl-key--ssl-cert オプションを指定する必要があります。

  • REQUIRE X509 は、クライアントが有効な証明書を持つ必要があるが、その証明書、発行者、そして題目は何でもかまわないという事を意味します。要求されるのは、CA 証明の1つによってそのサインを検証できなければいけない、という事だけです。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      IDENTIFIED BY 'goodsecret' REQUIRE X509;

    接続するには、クライアントは --ssl-ca--ssl-key--ssl-cert オプションを指定する必要があります。

    これは REQUIRE オプションが X509 の意味を含む為、ISSUERSUBJECT にとっても同じ事が言えます。

  • REQUIRE ISSUER 'issuer' は、クライアントが CA 'issuer' によって発行された有効な X509 証明を提示するよう、接続に制限を与えます。もしクライアントが、有効ではあるが異なる発行者による証明を提示したら、サーバは接続を拒否します。X509 証明の利用は、必ず暗号化を暗示しますので、SSL オプションはこの場合必要ありません。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      IDENTIFIED BY 'goodsecret'
      REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
        O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';

    'issuer' 値は単一文字列として入力されなければいけない事を覚えておいて下さい。

  • REQUIRE SUBJECT 'subject' は、クライアントがサブジェクト subject を含む有効な X509 証明を提示する接続に制限を与えます。もしクライアントが、有効ではあるが異なるサブジェクトによる証明を提示したら、サーバは接続を拒否します。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      IDENTIFIED BY 'goodsecret'
      REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
        O=MySQL demo client certificate/
        CN=Tonu Samuel/Email=tonu@example.com';

    'subject' 値は単一文字列として入力されなければいけない事を覚えておいて下さい。

  • REQUIRE CIPHER 'cipher' は十分な強さの暗号とキー長さが利用される事が保証されていなければいけません。SSL 自体は、短い暗号キーを利用している古いアルゴリズムが利用されると、弱くなる事があります。このオプションを利用すると、接続を許可する為に特定の暗号方法が利用されるように依頼する事ができます。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      IDENTIFIED BY 'goodsecret'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

SUBJECTISSUER、そして CIPHER オプションを、次のように REQUIRE 条項の中で組み合わせる事ができます。

GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
  IDENTIFIED BY 'goodsecret'
  REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
    O=MySQL demo client certificate/
    CN=Tonu Samuel/Email=tonu@example.com'
  AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
    O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';

AND キーワードは REQUIRE オプションとの間では任意です。

オプションの順番は重要では有りませんが、2回指定できるオプションはありません。

mysqld がスタートする時、全ての権限はメモリの中に読み込まれます。詳細に関しては 項 「権限の変更が反映するタイミング」 を参照して下さい。

1つのユーザに対してテーブル、カラム、またはルーチン権限を利用していると、サーバはテーブル、カラム、そしてルーチン権限を全てのユーザに対して分析し、その為に MySQL のスピードが少し遅くなります。同じように、もしユーザに対してクエリ、更新または接続の数を制限すると、サーバはそれらの値を監視しなければいけません。

SQL と MySQL GRANT バージョンとの最大の違いは次のような物です。

  • MySQL では、権限はユーザ名だけではなく、ホスト名とユーザ名の組み合わせと関連しています。

  • スタンダード SQL はグローバル、またはデータベース レベル権限を持たず、MySQL がサポートする全ての権限タイプのサポートもしません。

  • MySQL はスタンダード SQL UNDER 権限をサポートしません。

  • スタンダード SQL 権限は、階層的な様式で構造されています。もしユーザを削除すると、そのユーザが持つ全ての権限が与えられ、削除されます。もし DROP USER を利用するなら、MySQL でも同じです。詳しくは 項2. 「DROP USER 構文」 を参照してください。

  • スタンダード SQL では、テーブルをドロップすると、そのテーブルの全ての権限は削除されます。スタンダード SQL では、権限を削除すると、その権限に基づいて与えられた全ての権限もまた削除されます。MySQL では、明示的な REVOKE ステートメントだけの利用、または MySQL 供与テーブル内に格納された値の複製でドロップできます。

  • MySQL では、テーブル内のいくつかのカラムに対してだけ INSERT 権限を持つ事が可能です。この場合、INSERT 権限を持っていないそれらのカラムを削除するのであれば、テーブル上で INSERT ステートメントを実行する事ができます。削除されたカラムは、もしストリクト SQL モードが有効でなければ、暗黙的なデフォルト値に設定されます。ストリクト モードでは、もし削除されたカラムがデフォルト値を持たなければ、ステートメントは却下されます。(スタンダード SQL は、全てのカラムに INSERT 権限を持つように要求します。)項 「SQL モード」 で、ストリクト モードについて説明されています。項 「データタイプデフォルト値」 で暗黙のデフォルト値について説明されています。

4. RENAME USER 構文

RENAME USER old_user TO new_user
    [, old_user TO new_user] ...

RENAME USER ステートメントは既存 MySQL アカウントをリネームします。それを利用する為には、mysql データベースにグローバル CREATE USER 権限か UPDATE 権限を持つ必要があります。もし古いアカウントが存在しない時、または新しいアカウントが存在する時はエラーが発生します。各アカウントは、例えば、'jeffrey'@'localhost' のように GRANT ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%' 部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT 構文」 を参照してください。

RENAME USER は、ユーザが作成したデータベース オブジェクトを自動的に移動させたり、リネーム前にユーザが持っていた権限を移動させたりしません。これは、テーブル、ビュー、ストアド ルーチン、トリガ、そしてイベントに適応します。

5. REVOKE 構文

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

REVOKE ステートメントは、システム管理者が MySQL アカウントから権限を削除する事を可能にします。REVOKE を利用する為には、GRANT OPTION 権限を持ち、また自分が削除しようとしている権限を持っている必要があります。 各アカウントは、例えば、'jeffrey'@'localhost' のように GRANT ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%' 部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT 構文」 を参照してください。

どのレベルにどの権限が存在するのか、許容 priv_type 値、そしてユーザとパスワードを指定する為の構文については、項3. 「GRANT 構文」 を参照してください。

もし供与テーブルが、大文字と小文字が混在するデータベースかテーブル名を含む権限行を保持し、lower_case_table_names システム変数がゼロではない値に設定されたら、REVOKE をこれらの権限を廃止する為に利用する事はできません。供与テーブルを直接コントロールする必要があるかも知れません。(GRANTlower_case_table_names が設定された時にそのような行を作成しませんが、そのような行は変数を設定する前に作成されていた可能性があります。)

全ての権限を削除するには、名づけられた全てのユーザに対して、全てのグローバル、データベース、テーブル、そしてカラム レベルの権限をドロップする次の構文を利用してください。

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

この REVOKE 構文を利用する為には、mysql データベースにグローバル CREATE USER 権限か UPDATE 権限を持つ必要があります。

REVOKE は権限を削除しますが、user テーブル エントリのドロップはしません。それは DELETEDROP USER を利用して明示的に行う必要があります。(項2. 「DROP USER 構文」 を参照してください。)

6. SET PASSWORD 構文

SET PASSWORD [FOR user] = PASSWORD('some password')

SET PASSWORD ステートメントは既存 MySQL ユーザ アカウントにパスワードを割り当てます。

FOR 条項無しで、このステートメントは現在のユーザにパスワードを設定します。非匿名アカウントを利用しているサーバに接続したクライアントは、そのアカウントのパスワードを変更する事ができます。

このステートメントは、FOR 条項を利用して、現在のサーバ ホスト上の特定のアカウントにパスワードを設定します。mysql データベースの UPDATE 権限を持つクライアントだけがこれを実行できます。user 値は、user_namehost_name が、mysql.user テーブル エントリの UserHost カラム内でリストされているのと全く同じである user_name@host_name フォーマット内で与えられる必要があります。 例えば、もし 'bob''%.loc.gov'UserHost カラム値と共にエントリを持っていたら、 ステートメントを次のように書くでしょう。

SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');

これは、次のステートメントと同等です。

UPDATE mysql.user SET Password=PASSWORD('newpass')
  WHERE User='bob' AND Host='%.loc.gov';
FLUSH PRIVILEGES;

注意:もし MySQL 4.1 または pre-4.1 クライアント プログラムを利用するそれ以降のサーバに接続していたら、項 「MySQL 4.1 のパスワードハッシュ」 を読むまでは、前出の SET PASSWORDUPDATE ステートメントを利用しないでください。MySQL 4.1 で変更されたパスワード フォーマット、そして特定の状況下では、もしパスワードを変更するとその後サーバに接続する事ができなくなる、という事が起こり得ます。

SELECT CURRENT_USER() を実行する事によって、どのアカウントとしてサーバが認証したのかを見る事ができます。