MySQL アカウントを管理するには、その目的の SQL ステートメントを使用します:
CREATE USER
およびDROP USER
は、アカウントを作成および削除します。GRANT
およびREVOKE
は、アカウントに対する権限の割当ておよび取消しを行います。SHOW GRANTS
にアカウント権限の割当てが表示されます。
アカウント管理ステートメントを使用すると、サーバーは基礎となる付与テーブルに適切な変更を加えます。これらについては、セクション6.2.3「付与テーブル」 で説明します。
INSERT
、UPDATE
、DELETE
などのステートメントを使用して付与テーブルを直接変更することはお薦めできません。独自のリスクで実行してください。 これらの変更の結果として誤った形式となった行を、サーバーは随意で無視します。
付与テーブルを変更する操作の場合、サーバーはテーブルが予期された構造を持っているかどうかをチェックし、持っていない場合はエラーを生成します。 テーブルを必要な構造に更新するには、MySQL のアップグレード手順を実行します。 セクション2.11「MySQL のアップグレード」を参照してください。
アカウントを作成するためのもう 1 つのオプションは、GUI ツール MySQL Workbench を使用する方法です。 また、いくつかのサードパーティプログラムには、MySQL アカウント管理用の機能が用意されています。phpMyAdmin
はそのようなプログラムです。
このセクションでは、次のトピックについて説明します。
ここで説明するステートメントの詳細は、セクション13.7.1「アカウント管理ステートメント」 を参照してください。
次の例では、mysql クライアントプログラムを使用して、新しいアカウントを設定する方法を示します。 これらの例では、MySQL root
アカウントに CREATE USER
権限と、他のアカウントに付与されているすべての権限があることを前提としています。
コマンドラインで、MySQL root
ユーザーとしてサーバーに接続し、パスワードプロンプトで適切なパスワードを指定します:
shell> mysql -u root -p
Enter password: (enter root password here)
サーバーに接続した後、新しいアカウントを追加できます。 次の例では、CREATE USER
および GRANT
ステートメントを使用して 4 つのアカウントを設定します ('
が表示されている場合は、適切なパスワードを置き換えます):
password
'
CREATE USER 'finley'@'localhost'
IDENTIFIED BY 'password';
GRANT ALL
ON *.*
TO 'finley'@'localhost'
WITH GRANT OPTION;
CREATE USER 'finley'@'%.example.com'
IDENTIFIED BY 'password';
GRANT ALL
ON *.*
TO 'finley'@'%.example.com'
WITH GRANT OPTION;
CREATE USER 'admin'@'localhost'
IDENTIFIED BY 'password';
GRANT RELOAD,PROCESS
ON *.*
TO 'admin'@'localhost';
CREATE USER 'dummy'@'localhost';
これらのステートメントによって作成されるアカウントには、次のプロパティがあります:
-
2 つのアカウントのユーザー名は
finley
です。 どちらも、すべてを実行するための完全なグローバル権限を持つスーパーユーザーアカウントです。'finley'@'localhost'
アカウントは、ローカルホストから接続する場合にのみ使用できます。'finley'@'%.example.com'
アカウントは、ホスト部分で'%'
ワイルドカードを使用するため、example.com
ドメイン内の任意のホストからの接続に使用できます。'finley'@'localhost'
アカウントは、localhost
の匿名ユーザーアカウントがある場合に必要です。'finley'@'localhost'
アカウントがない場合、その匿名ユーザーアカウントは、finley
がローカルホストから接続し、finley
が匿名ユーザーとして処理されるときに優先されます。 これは、匿名ユーザーアカウントには'finley'@'%'
アカウントよりも具体的なHost
カラム値があるため、user
テーブルのソート順が早いためです。 (user
テーブルのソートの詳細は、セクション6.2.6「アクセス制御、ステージ 1: 接続の検証」 を参照してください。) 'admin'@'localhost'
アカウントは、ローカルホストから接続するためにadmin
でのみ使用できます。RELOAD
およびPROCESS
のグローバル管理権限が付与されます。 これらの権限を持つadmin
ユーザーは、mysqladmin reload、mysqladmin refresh、mysqladmin flush-xxx
コマンド、および mysqladmin processlist を実行できます。 任意のデータベースにアクセスするための権限は付与されません。 このような権限は、GRANT
ステートメントを使用して追加できます。'dummy'@'localhost'
アカウントにパスワードがありません (セキュアでないため、お薦めしません)。 このアカウントは、ローカルホストから接続する際にのみ使用できます。 権限は付与されません。GRANT
ステートメントを使用してアカウントに特定の権限を付与することを前提としています。
前の例では、グローバルレベルで権限を付与しています。 次の例では、3 つのアカウントを作成し、下位レベル、つまりデータベース内の特定のデータベースまたはオブジェクトへのアクセス権を付与します。 各アカウントのユーザー名は custom
ですが、ホスト名の部分は異なります:
CREATE USER 'custom'@'localhost'
IDENTIFIED BY 'password';
GRANT ALL
ON bankaccount.*
TO 'custom'@'localhost';
CREATE USER 'custom'@'host47.example.com'
IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON expenses.*
TO 'custom'@'host47.example.com';
CREATE USER 'custom'@'%.example.com'
IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON customer.addresses
TO 'custom'@'%.example.com';
3 つのアカウントは、次のように使用できます。
'custom'@'localhost'
アカウントには、bankaccount
データベースにアクセスするためのすべてのデータベースレベルの権限があります。 アカウントを使用してサーバーに接続できるのは、ローカルホストからのみです。'custom'@'host47.example.com'
アカウントには、expenses
データベースにアクセスするための特定のデータベースレベル権限があります。 このアカウントは、ホストhost47.example.com
からのみサーバーに接続するために使用できます。'custom'@'%.example.com'
アカウントには、example.com
ドメイン内の任意のホストからcustomer
データベース内のaddresses
テーブルにアクセスするための特定のテーブルレベルの権限があります。 アカウント名のホスト部分に%
ワイルドカード文字が使用されているため、アカウントを使用してドメイン内のすべてのマシンからサーバーに接続できます。
アカウントの権限を表示するには、SHOW GRANTS
を使用します:
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+-----------------------------------------------------+
アカウントの非特権プロパティーを表示するには、SHOW CREATE USER
を使用します:
mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost'
IDENTIFIED WITH 'caching_sha2_password'
AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT
print_identified_with_as_hex
システム変数 (MySQL 8.0.17 で使用可能) を有効にすると、SHOW CREATE USER
では、印刷できない文字を含むハッシュ値が、通常の文字列リテラルとしてではなく 16 進数文字列として表示されます。
アカウント権限を取り消すには、REVOKE
ステートメントを使用します。 権限は、異なるレベルで付与できるのと同様に、異なるレベルで取り消すことができます。
グローバル権限を取り消します:
REVOKE ALL
ON *.*
FROM 'finley'@'%.example.com';
REVOKE RELOAD
ON *.*
FROM 'admin'@'localhost';
データベースレベルの権限を取り消します:
REVOKE CREATE,DROP
ON expenses.*
FROM 'custom'@'host47.example.com';
テーブルレベルの権限を取り消します:
REVOKE INSERT,UPDATE,DELETE
ON customer.addresses
FROM 'custom'@'%.example.com';
権限取消しの影響を確認するには、SHOW GRANTS
を使用します:
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+---------------------------------------------+
| Grants for admin@localhost |
+---------------------------------------------+
| GRANT PROCESS ON *.* TO 'admin'@'localhost' |
+---------------------------------------------+