2013-03-20 9 views
174

Ich habe versucht, einfache SQL-Befehl auszuführen:Genehmigung Beziehung verweigert

select * from site_adzone; 

und ich habe diesen Fehler

ERROR: permission denied for relation site_adzone 

Was ist das Problem hier sein könnte?

Ich habe versucht, auch für andere Tabellen zu tun und bekam das gleiche Problem. Ich habe auch versucht, dies zu tun:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom; 

aber ich habe diese Antwort von der Konsole

WARNING: no privileges were granted for "jerry" 

Haben Sie eine Idee haben, was kann falsch sein?

+0

Ich bin nicht sicher, wie Berechtigungen zu aktualisieren, um I/Schreib in DB – bla0009

+1

lesen Sie müssen die erforderlichen Berechtigungen erteilen: http: // www. postgresql.org/docs/current/static/ddl-priv.html und http://www.postgresql.org/docs/current/static/sql-grant.html –

+2

Willkommen bei SO! Für diese Frage erhalten Sie möglicherweise mehr Hilfe bei dba.stackexchange.com, obwohl Sie möglicherweise genauso viele abfällige Kommentare finden :) –

Antwort

219

GRANT auf der Datenbank ist nicht das, was Sie brauchen. Grant auf den Tischen direkt.

Das Erteilen von Berechtigungen für die Datenbank wird hauptsächlich zum Gewähren oder Widerrufen von Verbindungsberechtigungen verwendet. Auf diese Weise können Sie festlegen, wer in der Datenbank Daten ausführen darf, wenn sie über ausreichende andere Berechtigungen verfügen.

Sie wollen statt:

GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry; 

Diese Pflege dieses Problem nehmen.

+0

Ich versuchte dies gewähren alle Privilegien auf der Tabelle site_adzone zu jerry; und bekam diese Antwort Fehler: Berechtigung verweigert für die Beziehung site_adzone – bla0009

+5

führen Sie es als Superuser, wie Postgres. –

+11

Kann das irgendwie abgekürzt werden? ALLE PRIVILEGES AUF ALLEN TABELLEN ERHALTEN? – Shadur

132

Posting Ron E Antwort für Erteilungsberechtigungen auf allen Tabellen, wie es für andere nützlich sein könnte.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; 
+2

dieser ist die richtige Antwort! der andere ist nur für eine Erlaubnis für eine Tabelle – stackdave

+7

Sie müssen möglicherweise auch einen ähnlichen Befehl für 'ALLE SEQUENZEN' und' ALLE FUNKTIONEN' ausführen. – Pistos

29

Connect auf der rechten Seite Datenbank zuerst, dann laufen:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; 
+0

danke Verbindung zur richtigen Datenbank war nicht ich tat früher! – asgs

+2

Verbindung mit der richtigen Datenbank macht eine große Dufferenz :) '\ connect databasename;' –

+0

DIESE. Ich war die ganze Zeit mit "Postgres" verbunden. Danke! –

5

für vorhandene Tabellen Berechtigungen zu erteilen verwenden:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role> 

Standardberechtigungen festlegen, die angewendet werden soll zukünftige Tabellen verwenden:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
    GRANT <privileges> ON TABLES TO <role>; 

z.B.

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin; 

Wenn Sie SERIAL oder BIGSERIAL Spalten dann werden Sie wahrscheinlich das gleiche für SEQUENCES tun wollen, oder aber Ihre INSERT fehl (Postgres 10's IDENTITY nicht von diesem Problem leiden, und wird über die SERIAL Typen empfohlen)

, dh
ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>; 

Siehe auch meine Antwort auf PostgreSQL Permissions for Web App, um weitere Informationen und eine wiederverwendbare Skript.

Ref:

GRANT

ALTER DEFAULT PRIVILEGES