2015-12-03 6 views
6

Ich habe folgende Postgres Benutzer, die ich durch Aufrufen der \ du Befehl im Terminal anzeigen können, wie folgt:Wie Benutzer von Postgres Datenbank löschen

postgres=# \du 

          List of roles 
Role name |     Attributes     | Member of 
-----------+------------------------------------------------+----------- 
postgres | Superuser, Create role, Create DB, Replication | {} 
tutorial1 |            | {} 

Nach dem postgres documentation, sollte ich fallen der Lage sein, der Benutzer rief "tutorial1" durch Eingabe des folgenden Befehls auf:

postgres=# DROP USER tutorial1 

Wenn ich diesen Befehl verwende, geschieht nichts. Die Dokumentation gibt keine Hinweise darauf, warum dies nicht funktioniert, und liefert keine klaren Beispiele.

Das sagte - was ist der Befehl, diesen Benutzer zu löschen?

+4

'DROP ROLE tutorial1;' http://www.postgresql.org/docs/9.4/static/sql-droprole.html –

+3

Ich nehme an, Sie haben Semikolon am Ende der Anweisung vergessen ';' –

+3

Alle Aussagen müssen Ende mit einem ';' –

Antwort

1

Ihr Befehl ist in Ordnung, aber Sie vergessen, ; am Ende des Befehls zu setzen.

Versuchen Sie, wie dieses

postgres=# DROP USER tutorial1; (Note I put semicolon at the end) 
+0

Downvoted Ihre Antwort wegen dieses Fehlers 'ERROR: Rolle" tutorial1 "kann nicht gelöscht werden, da einige Objekte davon abhängen" – kabrice

1

Wenn Sie sich hier (wie mich), weil Sie nicht in der Lage sind, um die Benutzer zu löschen, kann die folgende Vorlage nützlich sein:

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

Der Benutzer kann Privilegien in anderen Schemas. In diesem Fall müssen Sie die entsprechende REVOKE-Zeile mit "public" durch das korrekte Schema ersetzen. 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 '%postgres%'; 

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