【Redshift】権限周り | NOSAKAブログ

調べたきっかけ。

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も必要。
要するに、どのユーザ・どのグループにどんな権限を与えたかをドキュメントに残しておく必要あり。