なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

MySQLの権限と付与状況の「見え方」

グローバル権限、データベース権限、テーブル権限など

Oracleではシステム権限とオブジェクト権限(と、SYSDBAなどの特殊権限)に別れるように、MySQLも権限のレベルがあります。

Oracleでいうところのシステム権限は、MySQLでグローバル権限、とおぼえてほぼ間違いないかと。

権限付与は、SQLお約束のGRANT文で。

GRANT 権限種類 [(カラム)] ON データベース.テーブル TO 付与対象ユーザ [WITH GRANT OPTION]

ここで、
データベース:sampledb
テーブル:sample_tbl
カラム:col1,col2, ...
といった構造がある場合、GRANT文は以下の様な感じ。

権限種別 GRANT文
グローバル権限 GRANT 権限種別 ON *.* TO ...
データベース権限 GRANT 権限種別 ON sampledb.* TO ...
テーブル権限 GRANT 権限種別 ON sampledb.sample_tbl TO ...
カラム権限 GRANT SELECT(col1,col2) ON sampledb.sampletbl TO ...

ストアドルーチン(ストアドプロシージャ)に対する権限コントロールも、テーブル権限の構文と同じです。

権限の種類

これは素直にマニュアルを見るべし。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.1.4 GRANT 構文
表 13.1 GRANT および REVOKE に対して許容可能な権限

に、権限の種類と、どの権限がどのレベルで付与可能か記載されています。


Oracle経験者には、いくつか見慣れない権限があるものの、おおよそ困ることはないかと思います。

「USAGE権限」とは

「権限なし」のシノニムです
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.1.4 GRANT 構文

ってなんじゃいな、って感じの説明ですが。特に権限がないよ、っていう権限です。

Oracleではユーザーを作るとまっさきに付与する「connect」がほぼイコールだと思ってもらってよいかと。


MySQLでは、CREATE USER文を発行してユーザーを作成すると、「USAGE」権限が自動付与されて、接続自体は可能となります。

しかし、他の権限はついてないので、SELECT等何もできません。


権限付与状況の確認

SHOW GRANTS FOR ユーザー名

で、付与状況が確認できます。

特徴としては、

  • GRANT文そのまま出力されます。
  • 複数回に分けてGRANTしたとしても、マージされたGRANT文になります。
  • 権限レベル(グローバル/データベースなど)毎に1文で表現されます。
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO ユーザー名 IDENTIFIED BY PASSWORD '暗号化済パスワード' WITH GRANT OPTION


この場合、たくさんの権限種別が見えますが、グローバル権限だけを与えているため、1行で表現されます。
先ほどのUSAGEは、マージされて見えなくなってしまいますが、USAGE権限の名残としてIDENTIFIED BY パスワードが含まれています。

これが、データベース権限で付与されているユーザーの場合

GRANT USAGE ON *.* TO ユーザー名 IDENTIFIED BY PASSWORD '暗号化済パスワード' 
GRANT ALL PRIVILEGES ON データベース名.* TO ユーザー名

といったように、権限レベル毎に行が別れ、グローバル権限として唯一の存在であるUSAGEはそのまま見えている、という表示のされ方になります。



作業に先行して設計書とか手順書みたいなドキュメントに記述するとき、USAGEを記載するかしないかで混乱したので、調べてみましたとさ。

MariaDB&MySQL全機能バイブル

MariaDB&MySQL全機能バイブル