PostgreSQL インスタンス 向け Amazon Relational Database Service (Amazon RDS) でユーザーまたはロールを取り下げようとすると、「一部のオブジェクトがロールに依存しているため、ロールを取り下げできません」というエラーが表示されます。
簡単な説明
RDS for PostgreSQL のユーザーまたはロールがテーブルやスキーマなどのオブジェクトを作成する場合、ユーザーまたはロールは作成されたオブジェクトの所有者です。データベース内の 1 つ以上のオブジェクトを所有している、またはこれらのオブジェクトに対する権限を持つユーザーまたはロールを取り下げようとすると、ユーザーまたはロールに依存するオブジェクトと、付与されたアクセス許可 (存在する場合) を示すエラーが表示されます。
依存オブジェクトを持つユーザーまたはロールを取り下げるには、次を実行する必要があります。
- これらのオブジェクトの所有権を別のユーザーに再割り当てします。
- ユーザーまたはロールに付与されたアクセス許可をすべて取り消します。
注: これらのオブジェクトが不要になった場合は、これらのオブジェクトを取り下げてからロールを削除することを検討してください。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_user は another_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 のドキュメント