RDS for PostgreSQL DB インスタンスでユーザーまたはロールを取り下げできないのはなぜですか?

所要時間2分
0

PostgreSQL インスタンス 向け Amazon Relational Database Service (Amazon RDS) でユーザーまたはロールを取り下げようとすると、「一部のオブジェクトがロールに依存しているため、ロールを取り下げできません」というエラーが表示されます。

簡単な説明

RDS for PostgreSQL のユーザーまたはロールがテーブルやスキーマなどのオブジェクトを作成する場合、ユーザーまたはロールは作成されたオブジェクトの所有者です。データベース内の 1 つ以上のオブジェクトを所有している、またはこれらのオブジェクトに対する権限を持つユーザーまたはロールを取り下げようとすると、ユーザーまたはロールに依存するオブジェクトと、付与されたアクセス許可 (存在する場合) を示すエラーが表示されます。

依存オブジェクトを持つユーザーまたはロールを取り下げるには、次を実行する必要があります。

  1. これらのオブジェクトの所有権を別のユーザーに再割り当てします。
  2. ユーザーまたはロールに付与されたアクセス許可をすべて取り消します。

注: これらのオブジェクトが不要になった場合は、これらのオブジェクトを取り下げてからロールを削除することを検討してください。DROP OWNED コマンドを使用すると、データベース内のロールが所有するすべてのオブジェクトを取り下げできます。また、そのデータベースまたは共有オブジェクト内のオブジェクトに対するロールに付与された権限を取り消すこともできます。DROP OWNED コマンドが正常に実行されたら、ロールを取り下げることができます。

解決方法

次の例では、3 つの異なるデータベースロールが使用されています。

  • test_user: これは、取り下げる必要があるユーザーまたはロールです。
  • admin_user: これは、必要なユーザーまたはロールを取り下げるために使用されるロールです。このユーザーは、rds_superuser ロールがアタッチされた RDS で最も高い権限を持つユーザーです。
  • another_user: これは、test_user が所有するオブジェクトの所有権が割り当てられているユーザーまたはロールです。

以下のコマンドを実行して、ログインしたロールを確認します。

pg_example=> SELECT current_user;

出力は次のようになります。

current_user
--------------
 admin_user
(1 row)

依存オブジェクトを持つユーザーまたはロールを取り下げようとすると、次のようなエラーが表示されます。

pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
owner of table test_table
owner of schema test_schema
owner of sequence test_schema.test_seq
privileges for table test_t2

この例では、取り下げるロールは test_user です。現在ログインしているロールは、データベースのマスターユーザーである admin_user であることに注意してください。

エラーメッセージから、次の情報が表示されます。

  • ロール test_user には、データベース pg_example およびテーブル test_t2 に対して付与された権限があります。
  • ロール test_user は、テーブル test_table、スキーマ test_schema、および test_schema 内のシーケンスオブジェクト test_seq を所有しています。

注: 別のデータベースに接続しているときにユーザーまたはロールを取り下げると、次のような出力が得られます。

pg_another_db=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
4 objects in database pg_example

ユーザーまたはロールが所有するオブジェクトを確認するには、所有するオブジェクトが存在するデータベースに必ず接続してください。

ユーザーまたはロールを取り下げるには、所有するオブジェクトの所有権を別のユーザーまたはロールに再割り当てし、関連付けられているアクセス許可を取り消す必要があります。PostgreSQL REASSIGN OWNED コマンドを使用して、これらのオブジェクトの所有権を別のユーザーに再割り当てできます。このコマンドを実行すると、次のようなエラーが表示される場合があります。

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> REASSIGN OWNED BY test_user TO another_user;
ERROR:  permission denied to reassign objects

この問題を解決するには、所有権を再割り当てするユーザーにユーザーまたはロールを付与する必要があります。test_useranother_user の所有者ではないため、test_user を使用してこれを行うことはできません。そのため、次のようなエラーが表示される場合があります。

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> grant another_user to test_user;
ERROR:  must have admin option on role "another_user"

次のいずれかを実行して、所有権を再割り当てするユーザーにユーザーまたはロールを付与できます。

  • マスターユーザーにサインインし、GRANT コマンドを実行します。
pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE
  • 所有権を再割り当てするユーザーにサインインし、GRANT コマンドを実行します。
pg_example=> select current_user;
 current_user
--------------
 another_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE

上記のオプションのいずれかを選択した後、test_user にログインした後、test_user が所有するオブジェクトの所有権を another_user に再割り当てします。

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> reassign owned by test_user to another_user;
REASSIGN OWNED

マスターユーザーにサインインして、既存の権限がある test_user を取り下げようとすると、次のようなエラーが発生する可能性があります。

pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
privileges for table test_t2

この場合、REASSIGN コマンドが成功してもエラーが発生します。これは、test_user の権限を取り消す必要があるためです。REVOKE コマンドを実行して、test_user が権限を持つオブジェクトからすべての使用許可を取り消します。この例では、test_user のデータベース pg_example とテーブル test_t2 のアクセス許可を取り消します。

pg_example=> REVOKE ALL ON TABLE test_t2 FROM test_user;
REVOKE
pg_example=> REVOKE ALL ON DATABASE pg_example FROM test_user;
REVOKE

次に、ユーザー test_user を取り下げます。

pg_example=> DROP ROLE test_user;
DROP ROLE

権限を取り消した後は、ロールを正常に取り下げできます。


関連情報

DROP ROLE に関する PostgreSQL のドキュメント

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ