したいこと
- 初期で作成されるroot(master)ユーザー以外に新規でユーザーを作成し、運用を分けたい。
How To
- CREATEステートメントでUSERを作成
- GRANTステートメントで権限を付与
の2ステップ。
GRANTステートメントで付与できる権限について
多すぎるので、公式リファレンスを参照。
基本構文
基本構文については以下の通り。
◾️ ユーザー作成
CREATE '{user名}'@'{host名}' IDENTIFIED BY '{password}';
- user名とhost名の組み合わせにより、同じユーザー名であっても接続元のhostによって権限を変えることができる。
◾️ 権限付与
GRANT {付与したい権限名} ON {データベース名}.{テーブル名} TO 'user名'@'{host名}';
- 付与したい権限名はカンマ区切りで複数指定可能。
- データベース名やテーブル名は「*」によりワイルドカード指定が可能。
やってみる
◾️ 読み取り専用(カラムレベルのSELECT)権限を持ったユーザーの作成
ユーザーの作成〜権限付与。
CREATE USER 'readonly'@'%' IDENTIFIED BY 'readonly';
GRANT SELECT ON hogehoge.* TO 'readonly'@'%';
どのような権限が付与されたかどうかは SHOW GRANTS
ステートメントで確認できます。
SHOW GRANTS FOR 'readonly'@'%';
以下のような結果が返ってきます。
# Grants for readonly@%
'GRANT USAGE ON *.* TO `readonly`@`%`'
'GRANT SELECT ON `hogehoge`.* TO `readonly`@`%`'
'GRANT USAGE ON *.* TO `readonly`@`%`'
とありますが、USAGEというのは何も権限がない状態のことらしいです。
なにも権限がない状態を与えた上で、
'GRANT SELECT ON `hogehoge`.* TO `readonly`@`%`'
により、SELECT権限が与えられていることを示しているみたいですね。
◾️ 全権限を持ったユーザーの作成
CREATE 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL ON *.* TO 'root'@'%';
- ALLで全権限付与になります。
-
*.*
で意味合い的には{全てのデータベース}.{全てのテーブル}
となるのでグローバルな権限を持てます。
◾️ 既存ユーザーから同様の権限をもったユーザーを作成したい場合
これは応用です。察しの良い方はお分かりかと思いますが、SHOW GRANT
ステートメントで対象ユーザーに権限を付与したときのGRANTステートメントの構文が返ってくるので、権限付与の際にその構文のTOで指定するユーザーを変更し、実行してやれば良いです。
# Grants for readonly@%
'GRANT USAGE ON *.* TO `readonly`@`%`'
'GRANT SELECT ON `hogehoge`.* TO `{user名を変更}`@`%`' // この構文をコピーして実行する