今回の記事ではMySQLで作成したユーザーに何らかの権限を与える方法について解説していきます。
アカウント毎の権限付与は共同で開発を進める上で重要な要素となりますので、しっかり学習してみましょう。
権限の付与について
データベースでroot以外のアカウントを作成する場合には”CREATE USER”を使用しますが、これだけではまだ作成されたアカウントには何の権限もついていません。
そこでアカウントを作成したら次の作業として、アカウント毎に権限を持たせる必要が有ります。
この権限付与には次のクエリを使用します。
GRANT [権限] ON [適用対象のデータベース].[適用対象のテーブル] TO 'ユーザ名'@'ホスト名' IDENTIFIED BY 'パスワード';
上記クエリに記載されている[権限]項目は後述する為、今は省略します。
形としてはCREATE USERと変わらない式となっているので、そう難しいものではありません。
では次からはこの[権限]の内容について、もう少し掘り下げて解説します。
権限について
先ほど簡単に説明した[権限]の種類について、ここではリスト形式で見ていきます。
- ALL
- GRANT OPTION(権限の付与)以外の全てを許可する
- ALTER
- ALTER TABLE(テーブルの変更)の使用を許可する
- ALTER ROUTINE
- ストアドルーチンの変更・削除を許可する
- CREATE
- データベースとテーブルの作成を許可する
- CREATE ROUTINE
- ストアドルーチンの作成を許可する
- CREATE USER
- ユーザの作成・変更・削除を許可する
- DELETE
- DELETE文の使用を許可する
- DROP
- DROP文の使用を許可する
- EVENT
- イベントスケジューラのイベント作成を許可する
- INDEX
- インデックスの作成と削除を許可する
- INSERT
- INSERT文の使用を許可する
- SELECT
- SELECT文の使用を許可する
- SHOW DATABASES
- SHOW DATABASEで全データベースの表示を許可する
- SHUTDOWN
- mysqladmin shutdownの使用を許可する
- TRIGGER
- トリガの作成・削除を許可する
- UPDATE
- UPDATE文の使用を許可する
- USAGE
- 「権限なし」を設定する
これらのコマンドは一部であり、これ以外にも様々なコマンドが存在します。
またこれらのコマンドは適用される範囲がそれぞれ異なりますので、必要に応じて調べてみましょう。
権限の与え方について
では実際にコマンドを使用して権限を付与してみましょう。
この項目を進めていくにあたり、権限を与えるユーザーアカウントを作成するところから解説します。
また今回は「ALL」「権限を一つだけ与える方法」「複数権限を同時に与える方法」を解説しますので、ユーザーは3つ用意します。
それでは早速ですが下のクエリを見てください。
// 権限を与えるためのユーザーアカウントを作成する CREATE USER 'user_01'@'localhost' IDENTIFIED BY 'pass123'; Query OK, 0 rows affected (0.000 sec) CREATE USER 'user_02'@'localhost' IDENTIFIED BY 'pass123'; Query OK, 0 rows affected (0.000 sec) CREATE USER 'user_03'@'localhost' IDENTIFIED BY 'pass123'; Query OK, 0 rows affected (0.000 sec) // 作成したアカウントを確認する SELECT user, host FROM mysql.user; +---------+-----------+ | User | Host | +---------+-----------+ | root | 127.0.0.1 | | root | ::1 | | pma | localhost | | root | localhost | | user_01 | localhost | | user_02 | localhost | | user_03 | localhost | +---------+-----------+
まずアカウントを3つ作成しました。SELECTで確認すると3つのアカウントが追加されていることが確認できます。
続いて、この3つのアカウントに上記で書いたようにそれぞれ権限を与えましょう。
“user_01″には「ALL」を、”user_02″には「SELECTだけ」を、”user_03″には「INSERTとDELETE」を与えてみます。
// 権限を与えるためのユーザーアカウントを作成する GRANT ALL ON sample_db.sample_table TO 'user_01'@'localhost' IDENTIFIED BY 'pass123'; Query OK, 0 rows affected (0.000 sec) GRANT SELECT ON sample_db.sample_table TO 'user_02'@'localhost' IDENTIFIED BY 'pass123'; Query OK, 0 rows affected (0.000 sec) GRANT INSERT, DELETE ON sample_db.sample_table TO 'user_03'@'localhost' IDENTIFIED BY 'pass123'; Query OK, 0 rows affected (0.000 sec) FLUSH PRIVILEGES; Query OK, 0 rows affected (0.000 sec) // 権限を与えたアカウントを確認する show grants for 'user_01'@'localhost'; +----------------------------------------------------------------------------------------------------------------+ | Grants for user_01@localhost | +----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'user_01'@'localhost' IDENTIFIED BY PASSWORD '*FB6E1F205D675BC29B052DB14CCEFE7759C5FF7E' | | GRANT ALL PRIVILEGES ON `sample_db`.`sample_table` TO 'user_01'@'localhost' | +----------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.000 sec) show grants for 'user_02'@'localhost'; +----------------------------------------------------------------------------------------------------------------+ | Grants for user_02@localhost | +----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'user_02'@'localhost' IDENTIFIED BY PASSWORD '*FB6E1F205D675BC29B052DB14CCEFE7759C5FF7E' | | GRANT SELECT ON `sample_db`.`sample_table` TO 'user_02'@'localhost' | +----------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.000 sec) show grants for 'user_03'@'localhost'; +----------------------------------------------------------------------------------------------------------------+ | Grants for user_03@localhost | +----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'user_03'@'localhost' IDENTIFIED BY PASSWORD '*FB6E1F205D675BC29B052DB14CCEFE7759C5FF7E' | | GRANT INSERT, DELETE ON `sample_db`.`sample_table` TO 'user_03'@'localhost' | +----------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.000 sec)
このように、複数の権限を与える場合にはカンマで区切ってクエリを実行すると、複数の権限が同時に与えられていることが確認できたと思います。
なお権限を与える場合、”GRANT”を使用し全てのアカウントに設定を追加したら最後に”FLUSH PRIVILEGES;”で設定を反映させることを忘れないようにしてください。
権限を削除する
次は逆に権限の削除について解説していきます。
まずは下のクエリを見てください。
REVOKE [権限] ON [適用対象のデータベース].[適用対象のテーブル] FROM 'ユーザ名'@'ホスト名'; FLUSH PRIVILEGES;
権限の削除をする場合には”REVOKE”を使います。
基本的には権限の追加で使用した”GRANT”と同じですので使い方で悩むことはないと思います。
こちらも複数の権限を削除する場合にはカンマで区切って指定し、最後に設定の反映を行うために”FLUSH PRIVILEGES;”を実行して終わりです。
まとめ
いかがでしたか?
今回は権限を付与する”GRANT”と権限を削除する”REVOKE”について解説してみました。
MySQLで使用することが度々あると思いますので、まずは基本的なクエリでもあるこの辺りから学習してMySQLを触りながら慣れていくと良いと思います。