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

権限を持つ役割を削除する

    これは、ロールが何かを所有している、または権限が付与されている可能性がある同じクラスターのすべてのデータベースで実行します。

    REASSIGN OWNED BY some_role_name TO postgres;
    DROP OWNED BY some_role_name;
    

    postgres デフォルトのスーパーユーザーであるため、他のスーパーユーザーを選択できます。古いロールが現在所有しているオブジェクトを所有する予定です。 REASSIGN OWNEDの直後 所有されるオブジェクトは残っていません 同じユーザーによる。 DROP OWNEDを実行するのは直感的ではないように思われるかもしれません。 。コマンドの表現は誤解を招く可能性があります。また 同じデータベース内のロールのすべての特権とデフォルトの特権を取り消します。 マニュアル:

    大胆な強調鉱山。
    それでもすべての単一データベースで実行する必要があります。 ロールが何かを所有しているか、付与された特権を持っている場合。マニュアル:

    最後に、(1回)実行します:

    DROP role some_role_name;
    

    ロールはクラスター全体のシステムカタログに保存され、オブジェクトの所有権と特権はデータベースローカルシステムカタログに保存されます。

    この関連する回答の詳細な説明:

    マニュアルには、関連する手順が記載されたページがあります

    完全自動化

    すべてを実行する単一のコマンドはありません。ただし、Postgresに完全なpsqlスクリプトを生成させることができます。

    ロールの依存関係は、システムカタログ pg_shdepend

    (潜在的に)異なるデータベースに接続する必要があるため、psqlメタコマンドの組み合わせ( \ c my_database )が必要です。 )および上記のSQLDDLコマンド。この関数をDBクラスターのどこかに一度作成します:

    CREATE OR REPLACE FUNCTION f_generate_ddl_to_remove_role(dead_role_walking regrole)
      RETURNS text
      LANGUAGE sql AS
    $func$
    SELECT concat_ws(
       E'\n'
     ,(SELECT string_agg(format(E'\\c %I\nREASSIGN OWNED BY %2$s TO postgres; DROP OWNED BY %2$s;'
                              , d.datname, dead_role_walking)
                       , E'\n')
       FROM  (
          SELECT DISTINCT dbid
          FROM   pg_shdepend
          WHERE  refobjid = dead_role_walking
          ) s
       JOIN   pg_database d ON d.oid = s.dbid)
     , format(E'DROP role %s;\n', dead_role_walking)
       )
    $func$;
    

    電話:

    SELECT f_generate_ddl_to_remove_role('some_role_name');
    

    次のような文字列を生成します:

    \c my_db1
    REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
    \c my_db2
    REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
    DROP role some_role_name;
    

    または、役割が何も所有しておらず、特権も持っていない場合は、次のようにします。

    DROP role some_role_name;
    

    存在しないロール名を指定すると、エラーが発生します。

    文字列を(一重引用符で囲まずに) postgresのようなスーパーユーザーで開いたpsqlセッションにコピーします 。または、bashスクリプトをそれと連結します。すべて完了しました。

    動的SQLの詳細については、いくつかの関連する回答があります。



    1. 同じ構造の2つのMySQLデータベースをマージする方法

    2. SQL * Plusで、接続されているユーザーとデータベースを表示するようにプロンプ​​トを変更するにはどうすればよいですか?

    3. PowerShellを使用して.sqlファイルを実行する方法は?

    4. mysqlからphpに大きなデータを取得する方法は?