MySQLでユーザーを作成、権限を与える方法~CREATE USERとGRANT~
MySQLのCREATE USERとは?
MySQLのCREATE USERはユーザーを作成するために使用します。
ですが、作成したユーザーは何も権限がなく操作することができません。
ユーザーに権限を持たせるためにはGRANT句を使用します。
ここではMySQLでCREATE USERでユーザーを作成する方法、GRANT句で権限を与える方法を紹介します。
CREATE USERの使用方法
基本構文
CREATE USER user //パスワードなし
CREATE USER user IDENTIFIED BY 'パスワード' //パスワードあり
パスワードはシングルクォーテーションで囲んで記述し、userは「'user_name'@'host_name'」の書式で記述します。
「'user_name'@'host_name'」はユーザー名と接続を行うクライアントのホスト名の組み合わせを意味しています。
ホスト名にはIPアドレスやlocalhostを指定することが可能です。
指定したホストから指定したユーザー名でログインした場合だけ接続を行うことが出来ます。
ユーザー名(user_name)とホスト名(host_name)は特別な文字(例えば @ など)を含まない限りは引用符で囲う必要はありません。
逆に特別な文字を含む場合やホスト名にワイルドカードを使用する場合は逆引用符( ` ) 、シングルクォーテーション( ' )、ダブルクォーテーション( " )で囲う必要があります。
引用符で囲む場合はユーザー名とホスト名は別々に囲う必要があります
記述例
`user`@`hostname`
'user'@'localhost'
"user"@"host"
'username'@'192.168.128.10'
サンプルコード
ユーザー名momo、ホスト名localhost、パスワードpeachのユーザーを作成するには以下のコードとなります。
mysql> CREATE USER 'momo'@'localhost' IDENTIFIED BY 'peach';
MySQLでユーザーを作成すると、MySQLデータベースの中のuserテーブルに格納されるため、ユーザーが作成されているか確認するにはuserテーブルからSELECT句を使用して取得します。
mysql> SELECT user,host From mysql.user;
上記コードはカラムにuser,hostを指定しているため、ユーザー名とホスト名のユーザー一覧が表示されます。
ユーザー作成前のuserテーブル
mysql> SELECT user,host From mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
ユーザーを作成後のuserテーブル
mysql> CREATE USER 'momo'@'localhost' IDENTIFIED BY 'peach';
Query OK, 0 rows affected (0.16 sec)
mysql> SELECT user,host From mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| momo | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
しっかりとmomoというユーザーが作成されていることを確認できます。
作成したユーザーの権限を確認する方法
権限の確認を行う方法
作成したユーザーに権限を与える前にユーザーにどのような権限があるか確認する方法を紹介します。
SHOW GRANTS FOR user
userにはCREATE USERで紹介した「'user_name'@'host_name'」の書式で記述します。
サンプルコード
さきほど作成したmomoの権限を確認するには以下のコードとなります。
SHOW GRANTS FOR 'momo'@'localhost'
実行結果
mysql> SHOW GRANTS FOR 'momo'@'localhost';
+------------------------------------------+
| Grants for momo@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO `momo`@`localhost` |
+------------------------------------------+
「GRANT USAGE ON *.* TO `momo`@`localhost`」と表示されています。
USAGEは何も権限をもたないという意味を持ち、*.*はグローバルレベルを意味しています。
つまりmomoはグローバルレベルで何も権限を持っていないということになります。
グローバルレベルについてはまた後に説明します。
ユーザーに権限を与える方法
ユーザーに権限を与える基本構文は以下となります。
GRANT "与えたい権限" ON "権限のレベル" TO user;
userはCREATE USERで紹介した「'user_name'@'host_name'」の書式で記述します。
権限のレベルによって与えれる権限に制限があったりするため注意が必要です。
権限のレベルがグローバルレベルの場合
権限のレベルにグローバルレベルを指定すると全てのデータベースが対象となります。
記述例
GRANT ALL ON *.* TO user; //ALLはGRANT OPTION と PROXY 以外の全ての権限
GRANT SELECT ON *.* TO user;// SELECTの使用を可能にします
グローバルレベルを指定するには「*.*」を記述します。
権限のレベルが指定したデータベースレベルの場合
権限のレベルに指定したデータベースレベルを指定すると、指定したデータベースが対象となります。
記述例
GRANT ALL ON db_name.* TO user;
GRANT INSERT ON db_name.* TO user; // INSERTの使用を可能にします。
「db_name.*」のdb_nameはデータベース名を記述します。
権限のレベルが指定したテーブルレベルの場合
権限のレベルに指定したテーブルレベルを指定すると、指定したテーブルレベルが対象となります。
記述例
GRANT ALL ON db_name.table_name TO user;
GRANT CREATE ON db_name.table_name TO user; // CREATEの使用を可能にします。
「db_name.table_name」のdb_nameはデータベース名を記述し、table_nameには記述したデータベース内にあるテーブル名を記述します。
サンプルコード
CREATE USERで作成したmomoに、sampledbという名前のデータベースのsampletbという名前のテーブルでSELECT、CREATEを使用できる権限を与えるには以下のコードを記述します。
GRANT SELECT,CREATE ON sampledb.smpletd TO 'momo'@'localhost';
実際に実行してみると以下のようになります。
mysql> GRANT SELECT,CREATE ON sampledb.smpletd TO 'momo'@'localhost';
Query OK, 0 rows affected (0.14 sec)
mysql> SHOW GRANTS FOR 'momo'@'localhost';
+--------------------------------------------------------------------+
| Grants for momo@localhost |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `momo`@`localhost` |
| GRANT SELECT, CREATE ON `sampledb`.`smpletd` TO `momo`@`localhost` |
+--------------------------------------------------------------------+
しっかりと権限が与えられているのが確認できます。
まとめ
MySQLのCREATE USERでユーザーを作成する方法とGRANT句で権限を与える方法を簡単に紹介しました。
この記事ではGRANT句でグローバルレベル、データベースレベル、テーブルレベルを指定し権限を与える方法を説明しましたが、カラムレベルを指定し権限を与えることも出来ます。