web-dev-qa-db-ja.com

依存オブジェクトがある場合にpostgresでユーザーをドロップする方法

データベースIDの所有者はロールidd_ownerです。

データベースには、publicfirma1の2つのデータスキーマがあります。ユーザーは、このデータベースおよびオブジェクトに対して直接または間接的に権限を割り当てることができます。ユーザーはオブジェクトの所有者ではありません。権利を付与しただけです。

そのようなユーザーをドロップする方法は?

私は試した

revoke all on all tables in schema public,firma1 from "vantaa" cascade;
revoke all on all sequences in schema public,firma1 from "vantaa" cascade;
revoke all on database idd from "vantaa" cascade;
revoke all on all functions in schema public,firma1 from "vantaa" cascade;
revoke all on schema public,firma1 from "vantaa" cascade;
revoke idd_owner from "vantaa" cascade;
ALTER DEFAULT PRIVILEGES IN SCHEMA public,firma1 revoke all ON TABLES from "vantaa";
DROP ROLE if exists "vantaa"

しかしエラーが発生しました

role "vantaa" cannot be dropped because some objects depend on it
DETAIL:  privileges for schema public
DROP ROLE if exists "vantaa"

ユーザーがドロップできるようにこれを修正するにはどうすればよいですか?

ユーザー名をパラメーターとして受け取り、データをドロップせずにすべての場合にこのユーザーをドロップするsqlまたはplpgsqlメソッドを作成するにはどうすればよいですか?

Postgres9.1以降の使用

11
Andrus

ユーザーを削除する前に、以下を実行できます。

REASSIGN OWNED BY vantaa TO <newuser>

誰に再割り当てするかわからない場合は、postgresに再割り当てすることができます...

REASSIGN OWNED BY vantaa TO postgres;
5
aleroot

再割り当ては失敗する可能性があります。新しいユーザー/ロールに再割り当てする場合(現在選択されているデータベースで再割り当てする場合)、現在のユーザーは「from」ロールと「to」に属している必要があります(付与して後で取り消す)

私のシェルスクリプトの抜粋(いくつか省略)

# The DROP USER operation will fail if this user is the owner of an existing schema, table, index...
# The user creating a resource owns it. It should transfer the ownership to the role
# When reassigning, the current user needs to have the <<roles>> associated to BY and TO to execute the command.
GRANT $_roleservice TO $_superuser;                       
GRANT $_account TO $_superuser;                                                                
REASSIGN OWNED BY $_account TO $_roleservice;            
# dropping the user removes it from the current user list of roles/users
DROP USER $_account;  
REVOKE $_roleservice FROM $_superuser;  
4
Olivier D