MySQLではGRANTステートメントを使用して、ON *.*の部分が主な話となります。
権限レベル
権限レベルには主にグローバル権限、
グローバル権限
グローバル権限は管理者用のための権限です。GRANT構文のON *.*と記述します。
GRANT ALL ON *.* TO 'user'@'localhost';
権限情報はmysqlデータベースのuserテーブルに格納されます。
mysql> SELECT user, host, Select_priv FROM mysql.user WHERE user='user'; +----------+-----------+-------------+ | user | host | Select_priv | +----------+-----------+-------------+ | user | localhost | Y | +----------+-----------+-------------+
データベース権限
データベース権限は、ON dbname.*と記述します。
GRANT ALL ON userdb.* TO 'user'@'localhost'; GRANT SELECT ON userdb.* TO 'user'@'localhost';
権限情報はmysqlデータベースのdbテーブルに格納されます。
mysql> SELECT user, host, Select_priv FROM mysql.db WHERE user='user'; +------+-----------+--------+-------------+ | user | host | db | Select_priv | +------+-----------+--------+-------------+ | user | localhost | userdb | Y | +------+-----------+--------+-------------+
また、
GRANT SELECT ON `%`.* TO 'user'@'localhost'; GRANT SELECT ON `shard%`.* TO 'user'@'localhost';
1つ目の例はすべてのデータベースに対してSELECTを許可します。2つ目の例はshardという文字列に前方一致したデータベースに対してSELECTを許可します。
また、ALLと指定していますが、ALLとデータベース権限でのALLは違います。たとえば、SUPERやSHUTDOWNなどは管理者権限ですので、ALLでは付与されません。
どの権限がどの権限レベルに属するかは、
mysqlデータベースのdbテーブルの例
mysql> DESC mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+
テーブル権限
テーブル権限は、ON dbname.と記述します。権限情報はmysqlデータベースのtables_
GRANT SELECT ON userdb.usertable TO 'user'@'localhost';
1つのGRANT文に対して、
カラム権限
カラム権限は、privtype (columnname) ON dbname.というような記述になります。権限情報はmysqlデータベースのcolumns_
GRANT SELECT (col1), INSERT (col1,col2) ON dbname.tablename TO 'user'@'localhost';
また、
権限レベルのアクセス制御の順番
MySQLは対象のユーザに操作する権限があるのかを確認するために、
- グローバル権限
- データベース権限
- ワイルドカードのデータベース権限
- テーブル権限
- カラム権限
MySQLがアクセスを許可する流れを見てみます。
たとえば、SELECT権限を保持しているとします。SELECT権限はすべての権限レベルに属しています。SELECTが発行されると、
また、
GRANT SELECT ON `userdb`.* TO 'user'@'localhost'; GRANT INSERT ON `user%`.* TO 'user'@'localhost';
上記の場合は、userdbデータベースが存在しているとどちらも一致します。しかし、userdbデータベースに対する権限はSELECT権限のみとなります。
権限付与のタイミング
基本的には運用中はユーザ作成時に一緒に権限を付与することが多いと思います。では、
- グローバル権限・
・ 接続中のセッションには反映されません。再接続されたタイミングで反映されます。 - データベース権限・
・ 接続中のセッションが USE文を使用したタイミングで反映されます。 - テーブル権限、
カラム権限・ ・ 接続中のセッションがリクエストを発行したタイミングで反映されます。
よって、
たとえば、
まとめ
今回はGRANT文の権限レベルについて紹介しました。この権限レベルについて理解して、