PostgreSQL-既存の権限を持つユーザーをすばやく削除する方法


122

作業中のアプリの制限付きDBユーザーを作成しようとしています。実験に使用しているPostgresデータベースユーザーを削除します。最初にすべての権限を手動で取り消すことなく、またはユーザーが持っているすべての許可を取り消すことなく、ユーザーを削除する方法はありますか?

回答:


144

いかがですか

DROP USER <username>

これは実際にはのエイリアスですDROP ROLE

そのユーザーに関連付けられている特権を明示的に削除し、その所有権を他のロールに移動する(またはオブジェクトを削除する)必要があります。

これは、

REASSIGN OWNED BY <olduser> TO <newuser>

そして

DROP OWNED BY <olduser>

後者は、ユーザーに付与された特権を削除します。

DROP ROLEに関するpostgresのドキュメントとこの詳細については、こちらをご覧ください。


添加:

どうやら、ここで説明したコマンドを使用してユーザーを削除しようとしても、元のGRANTSが作成されたのと同じデータベースに接続しているときにそれらを実行している場合にのみ機能します。

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
実行中: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser エラーメッセージが表示されました:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo。しかしながら、DROP OWNED BY testuserトリックをしました、どうやらPostgresは許可をドロップ可能なオブジェクトであると考えています。
ミリムース

1
明確にしてください、@ Tim Kaneとmillimoose:FOO TO TESTUSERへのSELECTを許可してからTESTUSERによるDROP OWNED BY TESTUSERを許可した場合、元のテーブルを削除したくありません。DROP OWNED BYは付与をドロップするだけで、付与されたオブジェクトはドロップしないと言っていると思います。正しい?
Andrew Wolfe

1
Andrew、説明のためにドキュメントを読むのが最善です。DROP OWNED BY 、そのユーザーが所有するテーブル削除します。REASSIGN OWNED BYは、それらのテーブルを別のユーザーに再割り当てします。1つ選択してください。
Tim Kane

3
まだ保持している特権があるときにREASSIGN OWNEDを実行した後、DROP OWNED BYが過度に取り出されることが心配な場合は、すべての[TABLES | SEQUENCES | ...] IN SCHEMA [schema name] FROM [role]
jla

実際、DROP OWNED BYコマンドの意味と効果は少しあいまいです。正しく理解するには、ドキュメントを注意深く読む必要がありました。投稿してくれてありがとう。
セバスチャンクレメント

49

受け入れられた回答により、REASSIGN OWNED BYまたはDROP OWNED BYを試行するとエラーが発生しました。以下は私のために働きました:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

ユーザーは他のスキーマの権限を持っている可能性があります。その場合は、適切なREVOKE行を実行して、「public」を正しいスキーマに置き換えます。ユーザーのすべてのスキーマと権限タイプを表示するために、\ dpコマンドを編集して次のクエリを作成しました。

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

TABLES、SEQUENCES、またはFUNCTIONSでの取り消しに対応する特権の種類はわかりませんが、それらはすべて3つのうちの1つに該当すると思います。


12
私もこれを追加する必要がありました:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas '17 / 10/17

3
スキーマ特権も。
greatvovan

2
スキーマ特権の場合:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

私はこれを試しましたが、私の場合は問題が解決しません。私はそれをstackoverflow.com/questions/61168608/…に
Andrus

17

また、明示的に付与した場合は、次の点にも注意してください。

CONNECT ON DATABASE xxx TO GROUP

以下を使用して、これをDROP OWNED BYとは別に取り消す必要があります。

REVOKE CONNECT ON DATABASE xxx FROM GROUP


私は上記のすべてを試してみましたが、少し下にスクロールしてこれまで少しだけスクロールするまで、それでもうまくいきませんでした。いくつか。:Dありがとう!
ミッチ・ケント

6

REVOKEに1行追加する必要がありました...

実行後:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

私はまだエラーを受け取っていました: 一部のオブジェクトがそれに依存しているため、ユーザー名を削除できません詳細:スキーマパブリックの権限

私はこれを見逃していました:

REVOKE USAGE ON SCHEMA public FROM username;

それから私は役割を落とすことができました。

DROP USER username;

たとえば、pg_read_binary_fileなどの関数に対する権限を持つpg_rewindのユーザーを作成した場合は、「SCHEMA pg_catalog」の権限を取り消す必要がある場合があります。
GreenReaper

5

これが最終的に私のために働いたものです:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

2

がないREVOKE ALL PRIVILEGES ON ALL VIEWSため、次で終了しました:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

そしていつも:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

以下が成功するために:

drop role "XUSER";

0

コマンドラインには、dropuserpostgresからユーザーを削除するために使用できるコマンドがあります。

$ dropuser someuser

-19

私は同じ問題に直面し、今それを解決する方法を見つけました。まず、削除したいユーザーのデータベースを削除する必要があります。その後、ユーザーを簡単に削除できます。

私は「msf」という名前のユーザーを作成し、そのユーザーを削除して再作成するのにしばらく苦労しました。私は以下の手順に従って、成功しました。

1)データベースを削除する

dropdb msf

2)ユーザーをドロップする

dropuser msf

これで、ユーザーが正常に削除されました。


2
作業を繰り返すたびにデータベーススキーマを再作成する必要があったので、これは信じられないほどスラッシュアンドバーンのアプローチです。(既存のデータベーススキーマに対するきめの細かいアクセス許可が必要でした。つまり、データベーススキーマに手を付けないでおくのが最善です。)
millimoose
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.