2016-01-07 34 views
5

Sto provando a effettuare l'efficace drop role da un'istanza Postgres e si stanno verificando alcuni problemi. Sto cercando un po 'di SQL a drop role in modo che possa smettere di leggere i messaggi di errore e non devo farlo manualmente.Rilascio del ruolo e del database postgres dopo numerose concessioni

Nella configurazione sto lavorando in, ogni ruoli ottiene il proprio database con lo stesso nome:

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

utenti concedono spesso l'accesso a schemi nel loro database ad altri utenti:

-- alpha_user logs in to the alpha_user database 
GRANT USAGE ON SCHEMA myschema TO beta_user; 

Quando tento di goccia beta_user, questo avviene:

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

posso collegare il database alpha_user, e rilasciare OWNED BY, ma questo è inefficiente:

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

utenti possono concedere l'accesso a qualsiasi numero di database, e ci sono molti utenti. Esiste una dichiarazione (o una serie di dichiarazioni) che un superutente può eseguire su DROP OWNED BY per un utente su tutti i database a cui è stato concesso l'accesso?

+0

Qual è la tua versione di PostgreSQL e qual è il tuo sistema operativo? –

+0

Postgres 9.4 e Ubuntu 14.04. Perché dovrebbe essere importante il sistema operativo? – alacarter

+0

È possibile utilizzare l'aiuto degli strumenti da riga di comando forniti da linux. –

risposta

1

Forse questo ti aiuterà a:

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