2016-01-07 7 views
5

私は効率的にしようとしていますdrop roleポストグルインスタンスから、いくつかの問題に実行されます。私はdrop roleにいくつかのSQLを探していますので、エラーメッセージの読み込みを中止して手動で行う必要はありません。多くの助成金の後でpostgresの役割とデータベースをドロップ

CREATE ROLE alpha_user; 
CREATE DATABASE alpha_user; 
ALTER DATABASE alpha_user OWNER TO alpha_user; 

ユーザーは、多くの場合、他のユーザーに自分のデータベースにスキーマへのアクセス権を付与します:

-- alpha_user logs in to the alpha_user database 
GRANT USAGE ON SCHEMA myschema TO beta_user; 
を私は働いて、すべての役割は、同じ名前の独自のデータベースを取得しています設定で

私はbeta_userをドロップしようとすると、この問題が発生した:

-- log in as superuser 
DROP ROLE beta_user; 
-- ERROR: role "beta_user" cannot be dropped because some objects depend on it 
-- DETAIL: N objects in database alpha_user 

私がに接続することができますalpha_userデータベース、およびOWNED BYをドロップするが、これは非効率的である:

-- log in as superuser 
\c alpha_user; 
DROP OWNED BY beta_user CASCADE; 
DROP beta_user; 
-- success 

ユーザーがデータベースの任意の数へのアクセスを許可することができ、多くのユーザーが存在します。スーパーユーザーがユーザーにアクセス権を与えられたすべてのデータベースにわたってDROP OWNED BYに実行できるステートメント(または一連のステートメント)がありますか?

+0

のPostgreSQLのバージョンは何だとお使いのオペレーティングシステムは何ですか? –

+0

Postgres 9.4、およびUbuntu 14.04。オペレーティングシステムはなぜ重要なのでしょうか? – alacarter

+0

あなたはLinuxが提供するコマンドラインツールの助けを使うことができます。 –

答えて

1

多分これはあなたを助ける:

with 
    user_id as (select oid, rolname as my_user from pg_authid where rolname in('abc', 'xyz')) 
select 'REVOKE ' || rolname || ' FROM ' || my_user || ' CASCADE;' as sql 
from pg_auth_members 
join pg_authid on pg_auth_members.roleid = pg_authid.oid 
JOIN user_id ON pg_auth_members.member = user_id.oid 
union 
SELECT 'REVOKE ALL ON ' || datname || ' FROM ' || my_user || ' CASCADE;' 
FROM pg_database 
JOIN user_id ON pg_database.datdba = user_id.oid 
関連する問題