調べたきっかけ。
GRANT構文にDROPとかTRUNCATEがないのはどうして?
と思ったことから。
結論。
オブジェクト(テーブルとかビュー)所有者でないとDROPやTRUNCATEはできない。これらの権限を所有者以外に付与することはできない。
所有者の変更はSUPERUSERで行う。
bloom=# alter table <table_name> owner to <new_owner_name>;
ついでに。
デフォルト権限の設定方法もメモっとく。
linkスキーマの確認
いま、linkスキーマがこんな状態だとする。
bloom=> \dt
List of relations
schema | name | type | owner
--------+----------+-------+-------
link | category | table | bloom
link | date | table | bloom
link | event | table | bloom
link | listing | table | bloom
link | sales | table | bloom
link | users | table | bloom
link | venue | table | bloom
(7 rows)
参照専用のグループを作成し、ユーザを所属させる
このスキーマ内の全テーブルに参照権限を持つグループ"select_group"を作成する。
bloom=# create group select_group;
bloom=# grant select on all tables in schema link to group select_group;
bloom=# grant usage on schema link to group select_group;
select_groupにmytestuserを所属させる。
bloom=# alter group select_group add user mytestuser;
mytestuserでlinkスキーマ内のテーブルをSELECTできることを確認する。
bloom=> select * from category limit 1;
catid | catgroup | catname | catdesc
-------+----------+---------+-----------------------
1 | Sports | MLB | Major League Baseball
(1 row)
などなど。
select_groupに所属していても、後から作成されたテーブルを参照できないことを確認
新しいテーブルを作成。
bloom=# create table new_table(id integer,code integer);
CREATE TABLE
bloom=#
bloom=# insert into new_table values (1,111000),(2,222000);
INSERT 0 2
mytestuserでselectできないことを確認。
bloom=> select * from new_table ;
ERROR: permission denied for relation new_table
select_groupにdefault privilegeを与える
bloom=# alter default privileges grant select on tables to group select_group;
ALTER DEFAULT PRIVILEGES
その後、SUPERUSERのbloomちゃんで新テーブルnew_table2を作成。 mytestuserで参照できることを確認。
bloom=> select * from new_table2 ;
id | code
----+--------
1 | 111000
2 | 222000
(2 rows)
注意事項1
"alter default privilege〜"を実行前に作成されたテーブルに対しては、相変わらず参照権限がない。
①select_groupにlinkスキーマの参照権限付与。
②その後、別ユーザがlinkスキーマに作成したテーブル(new_table)の参照権限がない。
③alter default privilegeを唱える。
④別ユーザがlinkスキーマにnew_table2を作成。
select_group所属ユーザがlinkスキーマ内の全テーブルを参照できるようになるのは、③のalter〜後の話。
注意事項2
ユーザやグループの削除は、それらに与えたすべての権限の剥奪、所有オブジェクトの削除または所有者の変更が必要。default privilegeのrevokeも必要。
要するに、どのユーザ・どのグループにどんな権限を与えたかをドキュメントに残しておく必要あり。