REASSIGN
を使用する場合、非常に直感的でない権限要件がいくつかあります。 。
スーパーユーザーアカウントが利用できない場合(RDSまたはCloud SQLの場合など)、所有するオブジェクトをターゲットロールから再割り当てまたは削除するには、現在のロールにターゲットロールを付与する必要があることがわかりました。たとえば、アクティブなユーザーがpostsgres
の場合 、user_a
を削除しようとしています :
> DROP OWNED BY user_a
ERROR: permission denied to drop objects
> GRANT user_a TO postgres;
GRANT ROLE
> DROP OWNED BY user_a;
DROP OWNED
ここで、user_a
の場合、少し注意が必要になります。 たまたまpostgres
のメンバーです 特に、他のロールを介してそのメンバーシップを継承する場合は、schema_admin
と呼びましょう。 ...
> DROP OWNED BY user_a
ERROR: permission denied to drop objects
> GRANT user_a TO postgres;
ERROR: role "user_a" is a member of role "postgres"
-- Alright, let's try to revoke it...
> REVOKE postgres FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
ERROR: role "user_a" is a member of role "postgres"
-- It's still a member through the inherited grant - trying to revoke again doesn't work:
> REVOKE postgres FROM user_a;
WARNING: role "user_a" is not a member of role "postgres"
REVOKE ROLE
-- So you have to identify the role it's inheriting from, and revoke that:
> REVOKE schema_admin FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
GRANT ROLE
-- Now just to be safe, I'll reassign owned objects before actually dropping everything:
> REASSIGN OWNED BY user_a TO postgres;
REASSIGN OWNED
> DROP OWNED BY user_a;
DROP OWNED
> DROP ROLE user_a;
DROP ROLE;
出来上がり!
注:ここには、広く参照されている別の効果的な回答があります: https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ これは、新しい一時ユーザーとして作成してログインできる限り、うまく機能します。ただし、状況によっては、それ自体が問題になるため(完了したら、その一時的な役割を削除するための追加のクリーンアップもあります)、ここではそれを回避しようとしました。