以前、ser1という名前のPostgreSQLユーザーを作成しました(PostgreSQL 9.4.9)。
このユーザーを削除します。そのため、最初に、テーブル、シーケンス、関数、デフォルトの権限、所有権のすべての権限も取り消します。
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;
REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;
REASSIGN OWNED BY user1 TO postgres;
ただし、1つのオブジェクトが2つのデータベースでこのユーザーにリンクされたままのようです。
postgres=# DROP ROLE user1;
ERROR: role "user1" cannot be dropped because some objects depend on it
DETAIL: 1 object in database db1
1 object in database db2
それも関数のようです:
postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR: role "user1" cannot be dropped because some objects depend on it
DETAIL: privileges for function text(boolean)
1 object in database db2
しかし、どのオブジェクトが所有されているのか、またはuser1に関連しているのかを特定できません。
pg_dump -s db1 | grep user1
を実行すると、結果が得られません。それはグローバルオブジェクトでしょうか?
欠落しているオブジェクトを特定するにはどうすればよいですか?
各データベース(db1およびdb2)でコマンドを実行しました。 user1
が所有するオブジェクトを削除するのではなく、このユーザーの権限を再割り当てまたは削除するだけです。
エラーメッセージとその所有者で関数を探すには:
SELECT oid::regprocedure AS function
, pg_get_userbyid(proowner) AS owner
FROM pg_proc
WHERE oid = 'text(boolean)'::regprocedure;
関連:
エラーメッセージは言う:
詳細:関数テキストの権限(ブール値)
それは所有権についてではなくprivilegesについてです。
ロールを削除する前に、それが所有するすべてのオブジェクトを削除(またはその所有権を再割り当て)する必要がありますそしてロールが他のオブジェクトに付与されている特権をすべて取り消す。
およびALTER DEFAULT PRIVILEGES
: の場合
デフォルトの権限が変更されたロールを削除する場合は、そのデフォルトの権限の変更を元に戻すか、
DROP OWNED
BYを使用してロールのデフォルトの権限エントリを削除する必要があります。
また、1つのDBでREASSIGN OWNED
のみを実行したように見えますが、 マニュアルの説明:
REASSIGN OWNED
は他のデータベース内のオブジェクトには影響しないため、通常、削除するロールが所有するオブジェクトを含む各データベースでこのコマンドを実行する必要があります。
大胆な強調鉱山。
そして、IN SCHEMA public
でコマンドを制限しました。その句を削除して、DB全体をターゲットにします。しかし、気にしないでください...
DROP OWNED
を使用した簡単なソリューションREASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;
すべてのロールのオブジェクトは、最初のコマンドで所有権をpostgres
に変更し、安全です。 DROP OWNED
という表現は、すべての特権とデフォルトの特権も取り除くため、少し誤解を招く可能性があります。 DROP OWNED
のマニュアル:
DROP OWNED
は、指定されたロールの1つが所有する現在のデータベース内のすべてのオブジェクトを削除します。 現在のデータベース内のオブジェクトと共有オブジェクト(データベース、テーブルスペース)で指定されたロールに付与されているすべての権限も取り消されます。
関連するすべてのDBで繰り返し、キルのために移動できます。
DROP ROLE user1;
以下のクエリは、所有者を持つオブジェクトをリストします。すべての特権について、実際にはさらに多くのものが必要です。
--r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
SELECT
n.nspname AS schema_name,
c.relname AS rel_name,
c.relkind AS rel_kind,
pg_get_userbyid(c.relowner) AS owner_name
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
UNION ALL
-- functions (or procedures)
SELECT
n.nspname AS schema_name,
p.proname,
'p',
pg_get_userbyid(p.proowner)
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
最初にデータベースに接続する必要があります。あなたのインスタンスでは
\c db1
そして
\c db2
次に、REVOKE ALL PRIVILEGESおよびREASSIGN OWNED/DROP OWNEDステートメントを再度実行してください。