2016-01-07 35 views
5

sonra postgres rolünü ve veritabanını bırakarak Postgres örneğinden verimli bir şekilde drop role çalışıyorum ve bazı sorunlarla karşılaşıyorum. Bazı SQL'i drop role'a arıyorum, böylece hata mesajlarını okumayı durdurabilirim ve bunu elle yapmak zorunda değilim. Ben çalışıyorum kurulumunda Birçok hibe

her roller aynı adı taşıyan kendi veritabanını alır:

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

Kullanıcılar genellikle diğer kullanıcılara kendi veritabanında şemalar erişim izni:

-- alpha_user logs in to the alpha_user database 
GRANT USAGE ON SCHEMA myschema TO beta_user; 
Ben beta_user damla istediğinizde

şunlar olur:

-- 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 

Ben bağlanabilir alpha_user veritabanı ve OWNED BY damla, ancak bu verimsiz:

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

Kullanıcılar veritabanlarının herhangi bir sayı erişim izni verebilir ve birçok kullanıcı var. Bir süper kullanıcının, kullanıcıya erişim izni verilen tüm veritabanlarında bir kullanıcı için DROP OWNED BY'a uygulayabileceği bir ifade (veya ifade dizisi) var mı?

+0

PostgreSQL sürümünüz nedir ve işletim sistemi nedir? –

+0

Postgres 9.4 ve Ubuntu 14.04. İşletim sistemi neden önemlidir? – alacarter

+0

Linux'un sağladığı komut satırı araçlarının yardımını kullanabilirsiniz. –

cevap

1

Belki bu size yardımcı olacaktır:

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