Amazon Redshiftでユーザー削除する際の各種権限・設定を取り除く

2016.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

超小ネタです。

Amazon Redshiftで何らかの理由により使わなくなったユーザーを削除する際、コマンドとしてはDROP USERコマンドで対応出来ます。しかし、状況に拠っては以下の様にエラーメッセージが出てしまい、削除が遮られてしまう事もあります。当エントリではこのエラーが発生した際、どの部分を見て/対処して行けば良いのかについての備忘録を残しておこうと思います。

xxxxxxx=# DROP USER cm_user;
ERROR:  user "cm_user" cannot be dropped because the user has a privilege on some object

テーブルの所有者

まずは所有テーブルから。削除対象となるユーザーが何らかのテーブル所有者であると、そのユーザーは削除出来ません。所定のユーザーがテーブルを所有しているか否かについては、以下のSQL文で確認が出来ます。

# SELECT * FROM pg_tables;
     schemaname     |     tablename      | tableowner  | tablespace | hasindexes | hasrules | hastriggers 
--------------------+--------------------+-------------+------------+------------+----------+------------ 
:
cm_test             | testtable          | cm_user     |            | f          | f        | f
:

対象となるテーブルが割り出せたら、対象テーブルそのものを削除するか、テーブルの所有者を変更します。

# DROP TABLE cmtest.testtable;
# ALTER TABLE cmtest.testtable OWNER TO another_user;

ビューの所有者

テーブル同様、ビューについても所有者情報が存在します。

# SELECT schemaname, viewname,viewowner FROM pg_views;
     schemaname     |                    viewname                     | viewowner  
--------------------+-------------------------------------------------+------------
 cm_test            | v_cm_test                                       | cm_user
 :

対象のビューを削除します。ビュー自体が必要であれば削除後に別ユーザーによる再作成を行う必要があります。

# DROP VIEW v_cm_test;

テーブル・ビューのアクセス権限

テーブルやビューの所有者でない場合でも、そのテーブルに対して何らかのアクセス権限が設定されている場合も今回の対象となります。以下エントリに記載のSQL文で該当のユーザーを含むアクセス権限情報を洗い出し、

必要な権限を剥奪するREVOKE文を対象テーブル文、実行します。

# REVOKE SELECT ON TABLE cm_another_table FROM cm_user; /** 参照権限削除:テーブル単体の場合 */
# REVOKE SELECT ON ALL TABLES IN SCHEMA cm_test FROM cm_user; /** 対象スキーマ内全テーブルの参照権限削除の場合 */
# REVOKE ALL ON TABLE cm_another_table FROM cm_user; /** 対象テーブル単体の全ての権限削除 */

スキーマの利用権限(USAGE)

テーブルアクセスする際には予めUSAGE権限を対象となるグループやユーザーに設定しておく必要がありますが、この権現が残っていてもユーザーは削除出来ません。pg_catalog.pg_namespaceテーブルにアクセスし、以下の様に設定の記載がある箇所を洗い出します。

# SELECT * FROM pg_catalog.pg_namespace;
 nspname  | nspowner |                  nspacl                                            
----------+----------+------------------------------------------------
 :
 sch_test |      123 | {cm_user=U/root}
 :

スキーマの利用権限剥奪はREVOKEコマンドを使って以下の様に行います。

# REVOKE USAGE ON SCHEMA sch_test FROM cm_user;
REVOKE

スキーマの所有者

削除対象ユーザーが任意のスキーマの所有者だった場合も、引っ掛かります。

# SELECT * FROM pg_catalog.pg_namespace;
 nspname  | nspowner |                  nspacl                                            
----------+----------+------------------------------------------------
 :
 sch_chk  |      234 | {cm_xxxx=U/root}
 :

# SELECT * FROM pg_user
   usename   | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig 
-------------+----------+-------------+----------+-----------+----------+----------+-----------
 :
 cm_user     |      234 | f           | f        | f         | ******** |          | 
 :

スキーマについては丸ごと削除ってのもいきなりは考えづらいので、ここは所有者変更が無難かと。

# ALTER SCHEMA sch_chk OWNER TO another_user;

まとめ

上記の設定を確認したうえで障壁となる設定をを取り除く、変更する事で、晴れて対象のユーザーを削除する事が可能となります。

# DROP USER cm_user;
DROP USER

当エントリでは『ユーザー』の設定にフォーカスしましたが、『グループ』の場合でも(アクセス権限設定等の部分については)応用出来るかと思いますのでご参考頂けますと幸いです。こちらからは以上です。