2016-01-07 3 views
5

Ich versuche effizient drop role von einer Postgres-Instanz, und läuft in einige Probleme. Ich suche nach SQL zu drop role, damit ich aufhören kann, Fehlermeldungen zu lesen, und das nicht manuell tun muss.Dropgres Rolle und Datenbank nach vielen Zuschüssen

Im Setup in arbeite ich, bekommen alle Rollen eine eigene Datenbank mit dem gleichen Namen:

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

oft Benutzer Zugriff auf Schemata in ihrer Datenbank zu anderen Benutzern gewähren:

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

Wenn ich versuche, beta_user fallen zu lassen, geschieht dies:

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

ich verbinden kann die alpha_user Datenbank und fallen OWNED BY, aber dies ist ineffizient:

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

Benutzer Zugriff auf eine beliebige Anzahl von Datenbanken gewähren kann, und es gibt viele Anwender. Gibt es eine Anweisung (oder eine Reihe von Anweisungen), die ein Superuser für einen Benutzer in allen Datenbanken, für die dem Benutzer Zugriff erteilt wurde, auf DROP OWNED BY ausführen kann?

+0

Was ist Ihre Version von PostgreSQL und was ist Ihr Betriebssystem? –

+0

Postgres 9.4 und Ubuntu 14.04. Warum sollte Betriebssystem wichtig sein? – alacarter

+0

Sie können die Hilfe der Befehlszeilenprogramme verwenden, die Linux zur Verfügung stellt. –

Antwort

1

Vielleicht wird dies Ihnen helfen:

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