sql >> データベース >  >> RDS >> PostgreSQL

データベースに接続するために付与されたロールを削除できません

    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/ これは、新しい一時ユーザーとして作成してログインできる限り、うまく機能します。ただし、状況によっては、それ自体が問題になるため(完了したら、その一時的な役割を削除するための追加のクリーンアップもあります)、ここではそれを回避しようとしました。




    1. Oracleの文字列を比較する

    2. MySQLでのUNIONとORDERBYの問題

    3. MySQLに接続する安全なPHPクラス?

    4. 登録エラーphp、mysql、データベースにデータがありません