これは、ロールが何かを所有している、または権限が付与されている可能性がある同じクラスターのすべてのデータベースで実行します。
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の詳細については、いくつかの関連する回答があります。