Erlaubnis für Beziehung verweigert

329

Ich habe versucht, einen einfachen SQL-Befehl auszuführen:

select * from site_adzone;

und ich habe diesen Fehler bekommen

ERROR:  permission denied for relation site_adzone

Was könnte hier das Problem sein?

Ich habe auch versucht, für andere Tabellen auszuwählen und habe das gleiche Problem bekommen. Ich habe auch versucht, dies zu tun:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

aber ich habe diese Antwort von der Konsole erhalten

WARNING:  no privileges were granted for "jerry"

Haben Sie eine Idee, was falsch sein kann?

Boban
quelle
Ich bin nicht sicher, wie ich Berechtigungen aktualisieren soll, damit ich in DB lesen kann
Boban
1
Sie müssen die erforderlichen Berechtigungen gewähren: postgresql.org/docs/current/static/ddl-priv.html und postgresql.org/docs/current/static/sql-grant.html
a_horse_with_no_name
2
Willkommen bei SO! Für diese Frage erhalten Sie möglicherweise weitere Hilfe unter dba.stackexchange.com, obwohl Sie möglicherweise genauso viele abfällige Kommentare finden :)
Jared Beck
10
Entschuldigung. Dies ist die zweite sehr programmierbezogene Postgresql-Frage, die ich heute Abend als nicht zum Thema geschlossen gesehen habe! Der letzte hatte 67.000 Aufrufe, dieser 30.000 Aufrufe. Wir sollten eine Beliebtheitsklausel haben: Jede nicht subjektive Frage mit> 15.000 Ansichten = zum Thema.
Theodore R. Smith
1
Diese Frage ist nicht vom Thema! Es ist jedoch eine Vervielfältigung von stackoverflow.com/questions/13497352/…
Wheaties

Antworten:

391

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

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

Sie wollen stattdessen:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Dies wird dieses Problem beheben.

Chris Travers
quelle
7
Führen Sie es als Superuser aus, wie Postgres.
Chris Travers
19
Kann das irgendwie eine Abkürzung sein? ALLE PRIVILEGIEN AUF ALLEN TABELLEN GEWÄHREN?
Shadur
196
@Shadur GEWÄHRLEISTUNG ALLER PRIVILEGIEN FÜR ALLE TABELLEN IM SCHEMA public TO jerry;
Ron E
10
@ RonE ist das allerdings auf die aktuelle Datenbank beschränkt?
Shadur
7
@zmiftah für das benötigte Schema> GRANT ALL PRIVILEGES ON SCHEMA nameSchema TO user;
Pierozi
241

Veröffentlichen Sie die Antwort von Ron E, um Berechtigungen für alle Tabellen zu erteilen, da dies für andere nützlich sein kann.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
durchhängen
quelle
21
Möglicherweise müssen Sie auch einen ähnlichen Befehl für ALL SEQUENCESund ausführen ALL FUNCTIONS.
Pistos
7
Nur für diejenigen, die sich gefragt haben: ALL TABLESEnthält auch Ansichten, daher gibt es keinen separaten ALL VIEWSBefehl :-)
André Gasser
74

Stellen Sie zuerst eine Verbindung zur richtigen Datenbank her und führen Sie dann Folgendes aus:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
user2757813
quelle
4
Dank der Verbindung zur richtigen Datenbank war NICHT, was ich früher getan habe!
Asgs
15
Verbindung zur rechten Datenbank macht einen RIESIGEN Unterschied :)\connect databasename;
Denis Matafonov
3
DIESE. Ich war die ganze Zeit mit "postgres" verbunden. Vielen Dank!
Andrew G.
2
Ja, die Verbindung zur DB machte den Unterschied
Inostia
44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;
Klanjabrik
quelle
Diese Antwort hat mir den Tag gerettet!
Anhtran
19

Der erste und wichtigste Schritt ist die Verbindung zu Ihrer Datenbank:

psql -d yourDBName

2 Schritt, Berechtigungen gewähren

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;
zond
quelle
18

Verwenden Sie Folgendes, um Berechtigungen für alle vorhandenen Tabellen im Schema zu erteilen:

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

Verwenden Sie Folgendes, um Standardberechtigungen anzugeben, die auf zukünftige Tabellen angewendet werden:

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 SERIALoder BIGSERIALSpalten verwenden, möchten Sie wahrscheinlich dasselbe tun SEQUENCES, sonst schlägt Ihr INSERTFehler fehl ( Postgres 10IDENTITY leidet nicht unter diesem Problem und wird gegenüber den SERIALTypen empfohlen ), d. H.

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

Weitere Informationen und ein wiederverwendbares Skript finden Sie auch in meiner Antwort auf PostgreSQL-Berechtigungen für Web App .

Ref:

GEWÄHREN

ÄNDERN SIE STANDARDPRIVILEGIEN

Isapir
quelle
9

Dies tritt häufig auf, wenn Sie eine Tabelle als Benutzer postgres erstellen und dann versuchen, als normaler Benutzer darauf zuzugreifen. In diesem Fall ist es am besten, sich als Postgres-Benutzer anzumelden und den Besitz der Tabelle mit dem folgenden Befehl zu ändern:

alter table <TABLE> owner to <USER>;
Bruce
quelle
5

Stellen Sie sicher, dass Sie sich bei psql als Eigentümer der Tabellen anmelden. um herauszufinden, wem die Tabellen gehören\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

Dann können Sie die GRANTS ausführen

Brian McCall
quelle
0

Wenn Sie nach ausgewählten Berechtigungen suchen, würde ich Ihnen empfehlen, nur ausgewählte und nicht alle Berechtigungen zu erteilen. Sie können dies tun durch:

GRANT SELECT ON <table> TO <role>;
Sergi Ramón
quelle
0

Du solltest:

  1. Stellen Sie über den DBeaver mit dem Benutzer postgres eine Verbindung zur Datenbank her
  2. Öffnen Sie auf der linken Registerkarte Ihre Datenbank
  3. Öffnen Sie die Registerkarte Rollen / Dropdown
  4. Wählen Sie Ihren Benutzer aus
  5. Klicken Sie auf der rechten Registerkarte auf die Registerkarte "Berechtigungen".
  6. Drücken Sie auf die Registerkarte Schema
  7. Drücken Sie die Tabulatortabelle / Dropdown-Liste
  8. Wählen Sie alle Tabellen aus
  9. Aktivieren Sie alle erforderlichen Kontrollkästchen für Berechtigungen (oder drücken Sie Alle gewähren).
  10. Drücken Sie Speichern
Happydmitry
quelle
-3

Ich war einmal mit diesem Problem konfrontiert. Ändern Sie einfach den Datenbankbenutzer in einen Superuser und Ihr Problem ist gelöst.

ALTER USER myuser MIT SUPERUSER;

Adebayo Ogunmoriyele
quelle
Auf diese Weise gewähren Sie mehr Prämien als Sie benötigen. Superuser gibt ihnen die Erlaubnis für andere Vorgänge, die dieser Benutzer möglicherweise nicht ausführen soll, z. B. das Erstellen anderer Benutzer, Datenbanken usw.
Santi