権限の種類と設定されている権限の確認
作成したユーザーがMySQLに接続し、データベースやテーブルを作成したり、テーブルからデータを取得するにはその操作に対する権限が設定されている必要があります。ここではまずMySQLにおける権限の種類を確認し、そしてユーザーにどの権限が設定されているかどうか確認する方法を見ていきます。
権限のレベル
権限は大きく分けて次の5つのレベルが用意されています。
グローバル レベル(G) グローバルレベル権限は全てのデータベースに適用される権限です。この権限は mysql.user テーブルに格納されます。 データベース レベル(D) データベースレベル権限は特定のデータベース内の全てのオブジェクトに適用さ れる権限です。この権限は mysql.db と mysql.host テーブル内に格納されます。 テーブル レベル(T) テーブルレベル権限は特定のテーブル内の全てのカラムに適用される権限です。 この権限は mysql.tables_priv テーブル内に格納されています。 カラム レベル(C) カラムレベル権限は特定テーブル内の単一カラムに適用される権限です。この権 限は mysql.columns_priv テーブル内に格納されています。 ルーチン レベル CREATE ROUTINE、ALTER ROUTINE、EXECUTE、そして GRANT 権限はストアド ルー チンに適用される権限です。(ファンクションとプロシージャ)それらは、グロー バルとデータベース レベルで供与されます。また、CREATE ROUTINE 以外は、こ れらの権限は各ルーチンに対してルーチン レベルで適用する事ができ、 mysql.procs_priv テーブル内に格納されます。
グローバルレベルで権限は全てのデータベースに対する権限となります。それに対してデータベースレベルはデータベースを指定して権限を与える場合、テーブルレベルは特定のデータベースのさらに特定のテーブルに対する権限を与える場合、カラムラベルは特定のテーブルの中にある特定のカラムだけに対する権限を与える場合です。
例えば特定のデータベースにだけテーブルを作成する権限を与えたり、特定のテーブルのさらに特定のカラムの値だけを参照する権限を与えることなどができます。
権限の種類
次に与えることができる権限の種類です。
権限 | レベル | 意味 |
---|---|---|
ALL [PRIVILEGES] | GDT | GRANT OPTION 以外の全てのシンプルな権限を設定します。 |
ALTER | GDT | ALTER TABLE の使用を可能にします。 |
ALTER ROUTINE | GD | ストアド ルーチンの変更、ドロップを可能にします。 |
CREATE | GDT | CREATE TABLE の使用を可能にします。 |
CREATE ROUTINE | GD | ストアド ルーチンの作成を可能にします。 |
CREATE TEMPORARY TABLES | GD | CREATE TEMPORARY TABLE の使用を可能にします。 |
CREATE USER | G | CREATE USER、DROP USER、RENAME USER、そして REVOKE ALL PRIVILEGES の使用を可能にします。 |
CREATE VIEW | GDT | CREATE VIEW の使用を可能にします。 |
DELETE | GDT | DELETE の使用を可能にします。 |
DROP | GDT | DROP TABLE の使用を可能にします。 |
EVENT | GD | イベントスケジューラがイベントを作成するのを可能にします。 |
EXECUTE | G | ユーザがストアドルーチンを起動させるのを可能にします。 |
FILE | G | SELECT ... INTO OUTFILE と LOAD DATA INFILE の使用を可能にします。 |
INDEX | GDT | CREATE INDEX と DROP INDEX の使用を可能にします。 |
INSERT | GDTC | INSERTの使用を可能にします。 |
LOCK TABLES | GD | SELECT 権限を持つテーブル上の LOCK TABLES の使用を可能にします。 |
PROCESS | G | SHOW FULL PROCESSLIST の使用を可能にします。 |
REFERENCES | GDTC | インプリメントされていません。 |
RELOAD | G | FLUSH の使用を可能にします。 |
REPLICATION CLIENT | G | ユーザがスレーブとマスタの場所を問い合わせる事を可能にします。 |
REPLICATION SLAVE | G | 複製スレーブが必要とします。 (マスタからバイナリ ログ イベントを読み込む為) |
SELECT | GDTC | SELECT の使用を可能にします。 |
SHOW DATABASES | G | SHOW DATABASES は全てのデータベースを表示します。 |
SHOW VIEW | GD | SHOW CREATE VIEWの使用を可能にします。 |
SHUTDOWN | G | mysqladmin shutdown の使用を可能にします。 |
SUPER | G | CHANGE MASTER、KILL、PURGE MASTER LOGS、そして SET GLOBAL ステートメントの使用を可能にし、 the mysqladmin debug コマンドはmax_connections が達成していても接続を (一回) 許可します。 |
TRIGGER | GDT | ユーザがトリガを作成、ドロップするのを可能にします。 |
UPDATE | GDTC | UPDATE の使用を可能にします。 |
USAGE | G | 「権限が無い」 の同義語です。 |
GRANT OPTION | T | 権限を与えるのを可能にします。 |
権限の種類によって与える対象のレベルが決まっています。(G:グローバル、D:データベース、T:テーブル、C:カラムです)。
例えば「SELECT」権限ではグローバルレベル単位からカラム単位まで任意のレベルで設定することができますが、「CREATE USER」権限はグローバルレベルでしか与えることができません。つまり個別のデータベースにのみ有効なユーザーなどは作成できないということです。それに対してデータの取得は全データベースに対する権限を与えることもできますし、カラムを指定して与えることもできます。
設定されている権限の確認
ではユーザー毎にどのような権限が設定されているのかを確認してみます。権限を確認するにはSHOW GRANTS文を使います。書式は次の通りです。
SHOW GRANTS FOR user
この構文を実行すると、指定したユーザーに設定されている権限と同じ権限を設定するための必要なGRANT文を表示します。
実際には次のように入力します。
show grants for 'user'@'localhost';
また現在接続しているユーザーの権限について確認するには次のように入力することもできます。
show grants; show grants for current_user();
では実際に試してみます。
mysql> show grants for 'saru'@'192.168.128.1'¥G
表示されたGRANT文は次の通りです。
Grants for saru@192.168.128.1: GRANT USAGE ON *.* TO 'saru'@'192.168.128.1' IDENTIFIED BY PASSWORD '****'
GRANT文の詳細は次のページで確認しますが、上記は全てのデータベースに対して権限が無い状態に設定されています。よって現在では権限が必要な操作を何もできない状態です。CREATE USER文によって作成されただけのユーザーはこのように何も権限が設定されていません。
( Written by Tatsuo Ikura )