Berechtigung für Beziehung <Tabelle> verweigert

12

Ich habe die folgende SQL in psql ausgeführt:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Wenn ich mich anmelde bspuund versuche, die usersTabelle abzufragen , wird folgende Fehlermeldung angezeigt:

permission denied for relation users

Ich habe versucht zu laufen:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Aber es hilft nicht. Was mache ich falsch? Warum hat der Datenbankbesitzer KEINE Berechtigung zum Abfragen seiner eigenen Datenbank?

BEARBEITEN: Ich bspuhabe vorerst ein Upgrade auf Superuser durchgeführt, damit ich weiterarbeiten kann. Jede weitere Anleitung wird geschätzt.

wenn __name__ None ist
quelle
Was zeigt die Ausgabe von \dt "users"?
Bma
@bma nur mein Hauptkonto ist aufgeführt.
wenn __name__ Keine ist
Sie haben die ersten Befehle als welcher Benutzer ausgeführt? Was bekommen Sie SELECT session_user, current_useroben in Ihrem Skript? Und was ist deine Postgres-Version?
Erwin Brandstetter
Wenn dies genau die Befehle waren, die Sie ausgeführt haben, sind Sie immer noch mit Ihrem 'Haupt-Acc' verbunden. Es kommt also darauf an, welche Privilegien Sie haben. Ansonsten siehe Erwins ausgezeichnete Antwort. (Lassen Sie mich zugeben, dass ich es dumm finde, dass diese Fehlermeldung nicht sagt, welche Rolle keine Berechtigung hat. Wenn Sie beispielsweise eine Funktionskette mit SECURITY DEFINER ausführen, wird es ziemlich schnell verwirrend, wer wer ist.)
dezso

Antworten:

22

DEFAULT PRIVILEGESÄndern Sie nicht die Berechtigungen für vorhandene Objekte. Sie sind die Standardberechtigungen für neu erstellte Objekte und nur für die bestimmte Rolle, zu der sie gehören. Wenn Sie die Rolle beim Ausführen nicht definieren ALTER DEFAULT PRIVILEGES, wird standardmäßig die aktuelle Rolle verwendet (beim Ausführen der ALTER DEFAULT PRIVILEGESAnweisung.

Da Sie eine serialSpalte verwenden, die eine erstellt SEQUENCE, möchten Sie auch Standardberechtigungen für Sequenzen festlegen.

Führen Sie dies auf dem Benutzer aus, mit dem Sie Objekte erstellen, bevor Sie den CREATEBefehl ausführen :

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Wenn Sie pgAdmin verwenden sollten, ist Vorsicht geboten. In der aktuellen Version 1.20 (oder älter) ist ein Fehler in der Anzeige des Reverse Engineered SQL-Skripts für aufgetreten DEFAULT PRIVILEGES. Die Anzeige ignoriert den besitzenden Benutzer und ist daher in bestimmten Situationen falsch. Ich habe den Fehler gemeldet, die Angelegenheit steht noch aus .

Für vorhandene Objekte könnte Sie auch diese "Stapel" -Form des GRANTBefehls interessieren :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Mehr unter dieser verwandten Frage zu SO:

Erwin Brandstetter
quelle
1
Der erwähnte Fehler besteht weiterhin in pgAdmin4, siehe redmine.postgresql.org/issues/4685 , das als Duplikat von redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Srinu Mareti
quelle