2010-06-11 7 views

Antwort

84

Wie wäre es

DROP USER <username> 

Dies ist eigentlich ein Alias ​​für DROP ROLE ist.

Sie müssen explizit alle mit diesem Benutzer verbundenen Privilegien löschen, auch um seine Eigentumsrechte auf andere Rollen zu verschieben (oder das Objekt zu löschen).

Dies wird am besten durch

REASSIGN OWNED BY <olduser> TO <newuser> 

und

DROP OWNED BY <olduser> 

Letztere keine Privilegien für den Benutzer erteilt wird entfernen erreicht.

Siehe die Postgres-Dokumente für DROP ROLE und the more detailed description davon.


Zusatz:

offenbar versucht, einen Benutzer zu löschen, indem Sie die hier wird erwähnt Befehle funktionieren nur, wenn Sie sie ausführen, während zur gleichen Datenbank verbunden ist, der die ursprünglichen GELDER aus gemacht wurden, wie hier diskutiert:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local

+9

Doing: 'CREATE TABELLE foo (bar SERIAL); ALTER TABLE foo EIGENTÜMER NACH Postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser' gab die Fehlermeldung: 'Fehler: Rolle" testuser "kann nicht gelöscht werden, da einige Objekte davon abhängen DETAIL: Zugriff auf Tabelle foo'. Allerdings hat 'DROP OWNED BY testuser' den Trick gemacht, anscheinend hält Postgres Zuschüsse für Drop-Objekte. – millimoose

+1

Bitte klarstellen, @Tim Kane und Millimoose: Ich möchte wirklich nicht, dass die Originaltabellen gelöscht werden, wenn ich SELECT ON FOO TO TESTUSER und dann DROP Owned by TESTUSER. Ich denke, Sie sagen, dass DROP OWNED BY nur die Zuschüsse fallen lässt, aber nicht das Objekt fallen lässt, für das die Bewilligung gemacht wurde. Richtig? –

+1

Andrew, lesen Sie am besten die Dokumentation zur Klarstellung. DROP OWNED BY * wird * Tabellen löschen, die diesem Benutzer gehören. REASSIGN OWNED BY weist diese Tabellen einem anderen Benutzer zu. Wähle ein. –

8

beachten Sie auch, wenn Sie ausdrücklich erteilt haben:

CONNECT ON DATABASE xxx TO GROUP,

Sie müssen dies von DROP BY OWNED separat zu widerrufen, mit:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

-9

ich das gleiche Problem konfrontiert und nun einen Weg gefunden, es zu lösen. Zuerst müssen Sie die Datenbank des Benutzers löschen, den Sie löschen möchten. Dann kann der Benutzer einfach gelöscht werden.

Ich erstellte einen Benutzer namens "msf" und kämpfte eine Weile, um den Benutzer zu löschen und neu zu erstellen. Ich folgte den folgenden Schritten und Got gelungen.

1) Löschen Sie die Datenbank

dropdb msf 

2) fallen dem Benutzer

dropuser msf 

Jetzt habe ich der Benutzer erfolgreich gelöscht.

+1

Dies ist ein unglaublicher Slash-and-Burn-Ansatz, da ich das Datenbankschema für jede Iteration meiner Arbeit neu erstellen müsste. (Dies beinhaltete feingranulare Berechtigungen für ein existierendes Datenbankschema; d.h. es ist am besten, wenn das Datenbankschema unberührt bleibt.) – millimoose

1

Die akzeptierte Antwort führte zu Fehlern für mich beim Versuch, REASSIGN Owned By oder DROP Owned By.Die folgende für mich gearbeitet:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username; 
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username; 
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username; 
DROP USER username; 

Die Benutzerrechte in anderem Schema haben können, in welchem ​​Fall Sie die entsprechende REVOKE Linie mit „public“ durch das korrekte Schema ersetzt werden müssen laufen. Um alle Schemata und Privileg Typen für einen Benutzer anzeigen, bearbeiten ich den \ dp Befehl, um diese Abfrage zu machen:

SELECT 
    n.nspname as "Schema", 
    CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
    END as "Type" 
FROM pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%'; 

Ich bin nicht sicher, welches Privileg Typen entsprechen den Widerruf auf Tabellen, Sequenzen oder Funktionen, aber ich denke, alle fallen unter eine der drei.

Verwandte Themen