【MySQL】 テーブル・カラム毎に権限を変更する

MySQLにおいて、特定のユーザに対して

  • usersテーブルには読み込みだけ(select)
  • postsテーブルには読み書き両方(select, insert, update, delete)

と言った風にテーブル毎に権限を変更したい場合は、

GRANT 権限 ON db_name.table_name TO user;

のようにして権限を変更することができます。 具体的には、

mysql> GRANT select ON hogedb.users TO user1;
mysql> GRANT select,insert,update,delete ON hogedb.posts TO user1;

のようにして設定します。

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 テーブル内に格納されます。 
グローバルレベル:
GRANT 権限 ON *.* TO user;

データベースレベル:
GRANT 権限 ON db_name.* TO user;

テーブルレベル:
GRANT 権限 ON db_name.table_name TO user;

カラムレベル:
GRANT 権限 (カラム1, カラム2, ...) ON db_name.table_name TO user;

参考サイト

参考1

参考2