目次
GRANT文
GRANT文はアカウントに権限(Privilege)を与えるために使います。
今回はGRANTで扱う権限(Privilege)に絞って整理します。
権限の割り当ては、たまにしかしないので、毎回忘れてて難儀します。
なので、自分の備忘的にまとめておくのが目的です。
GRANTで付与できる権限レベル一覧
権限にはレベルがあって、レベルによって格納されているテーブルが違います。
権限レベル | 説明 | 格納テーブル |
---|---|---|
グローバルレベル(G) | 全てのデータベースに適用 | mysql.user |
データベースレベル(D) | 特定のデータベース内の全てのオブジェクトに適用 | mysql.db |
テーブルレベル(T) | 特定のテーブル内の全てのカラムに適用 | mysql.tables_priv |
カラムレベル(C) | 特定テーブル内の単一カラムに適用 | mysql.columns_priv |
ルーチンレベル(R) | ストアドルーチンに適用(ファンクションとプロシージャ) | mysql.procs_priv |
プロキシユーザー権限(P) | あるユーザーが別のユーザーの代理になることができる | mysql.proxies_priv |
とはいえ、普通に意識するのは「データベースレベル」だけで、「グローバルレベル」の権限を持つのはrootユーザくらいのはずです。
GRANTで付与できる権限の一覧
前記の権限レベルによって、付与可能な権限があります。
その一覧とレベルとの対応付けは以下のような感じです。
権限 | G | D | T | C | R | P | 意味 |
---|---|---|---|---|---|---|---|
ALTER | ○ | ○ | ○ | テーブルの変更を可能にします。 | |||
ALTER ROUTINE | ○ | ○ | ○ | ストアドルーチンの変更、削除を可能にします。 | |||
CREATE | ○ | ○ | ○ | データベース、テーブルの作成を可能にします。 | |||
CREATE ROLE | ○ | ロールの作成を可能にします。 | |||||
CREATE ROUTINE | ○ | ○ | ストアドルーチンの作成を可能にします。 | ||||
CREATE TABLESPACE | ○ | テーブルスペースとロググループの作成、変更、削除を可能にします。 | |||||
CREATE TEMPORARY TABLES | ○ | ○ | CREATE TEMPORARY TABLE の使用を可能にします。 | ||||
CREATE USER | ○ | CREATE USER 、 DROP USER 、 RENAME USER 、 REVOKE ALL PRIVILEGES の使用を可能にします。 | |||||
CREATE VIEW | ○ | ○ | ○ | ビューの作成と変更を可能にします。 | |||
DELETE | ○ | ○ | ○ | データベース、テーブル、ビューの削除を可能にします。 | |||
DROP | ○ | ○ | ○ | テーブルの削除を可能にします。 | |||
DROP ROLE | ○ | ロールの削除を可能にします。 | |||||
EVENT | ○ | ○ | イベントの利用を可能にします。 | ||||
EXECUTE | ○ | ○ | ○ | ストアドルーチンを起動させるのを可能にします。 | |||
FILE | ○ | SELECT ... INTO OUTFILE と LOAD DATA INFILE の使用を可能にします。 | |||||
GRANT OPTION | ○ | ○ | ○ | ○ | ○ | 権限の付与とを削除を可能にします。 | |
INDEX | ○ | ○ | ○ | インデックスの作成と削除を可能にします。 | |||
INSERT | ○ | ○ | ○ | ○ | INSERTの使用を可能にします。 | ||
LOCK TABLES | ○ | ○ | LOCK TABLES の使用を可能にします。 | ||||
PROCESS | ○ | SHOW FULL PROCESSLIST の使用を可能にします。 | |||||
PROXY | PROXYの使用を可能にします。 | ||||||
REFERENCES | ○ | ○ | ○ | ○ | 外部キーの作成を可能にします。 | ||
RELOAD | ○ | FLUSH の使用を可能にします。 | |||||
REPLICATION CLIENT | ○ | スレーブとマスタの場所を問い合わせることを可能にします。 | |||||
REPLICATION SLAVE | ○ | 複製スレーブを可能とします。 | |||||
SELECT | ○ | ○ | ○ | ○ | SELECT の使用を可能にします。 | ||
SHOW DATABASES | ○ | SHOW DATABASES の使用を可能とします。 | |||||
SHOW VIEW | ○ | ○ | ○ | SHOW CREATE VIEWの使用を可能にします。 | |||
SHUTDOWN | ○ | mysqladmin shutdown の使用を可能にします。 | |||||
SUPER | ○ | CHANGE MASTER TO 、 KILL 、 PURGE BINARY LOGS 、 SET GLOBAL 、mysqladmin debug command の使用を可能にします。 | |||||
TRIGGER | ○ | ○ | ○ | トリガの作成と削除を可能にします。 | |||
UPDATE | ○ | ○ | ○ | ○ | UPDATE の使用を可能にします。 | ||
DELETE HISTORY | ○ | ○ | システムバージョンのテーブルからのHISTORYの削除を可能にします。 |
サンプル的に付与して試してみる
とりあえず、ユーザを作って、GRANTをALLでかけてみて、どの権限が付与されて、どれが付与されないのかを確認してみることにします。
rootでログインし、登録済のユーザを一覧して、被らないユーザ名を適当に決めます。
select host,user from mysql.user;
今回は「gratest」というユーザを作ることにします。
とりあえず「localhost」で。
create user 'gratest'@'localhost' identified by 'grapass';
この時点では当然ながら、全権限は「N」(付与なし)です。
念のため、コマンドで確認してみます。
show grants for gratest@localhost;
「 USAGE」というのは、権限なし・・という意味です。
このユーザに「ALL」で権限を付与してみます。
データベースレベルにするので、対象のDB名は適当に「bltdb」にしてます。
GRANT ALL PRIVILEGES ON bltdb.* TO 'gratest'@'localhost'
bltdb.* だから、bltdbデータベースの全テーブルですね。
そうすると、GRANT OPTION以外の権限が付与されて、こんな感じになります。
mysql.db カラム名 | 権限 | Y=あり |
---|---|---|
Select_priv | SELECT | Y |
Insert_priv | INSERT | Y |
Update_priv | UPDATE | Y |
Delete_priv | DELETE | Y |
Create_priv | CREATE | Y |
Drop_priv | DROP | Y |
Grant_priv | GRANT OPTION | N |
References_priv | REFERENCES | Y |
Index_priv | INDEX | Y |
Alter_priv | ALTER | Y |
Create_tmp_table_priv | CREATE TEMPORARY TABLES | Y |
Lock_tables_priv | LOCK TABLES | Y |
Create_view_priv | CREATE VIEW | Y |
Show_view_priv | SHOW VIEW | Y |
Create_routine_priv | CREATE ROUTINE | Y |
Alter_routine_priv | ALTER ROUTINE | Y |
Execute_priv | EXECUTE | Y |
Event_priv | EVENT | Y |
Trigger_priv | TRIGGER | Y |
Delete_history_priv | DELETE HISTORY | Y |
ALLでやると楽なのですが、権限与えすぎなので、消したいなという場合もあります。
例えば、CREATE ROUTINとALTER ROUTINEの権限を消す場合だと。
revoke CREATE ROUTINE,ALTER ROUTINE on bltdb.* from gratest@localhost;
みたいな感じになります。
GRANTが「REVOKE」に変わって、GRANTの時の「TO」が、REVOKEの時は「FROM」になる点が違いです。
まあ、とりあえず、こんな感じですかね。
ではでは。