In Postgres habe ich die folgende Tabelle in einer Datenbank namens erstellt testing
:
CREATE TABLE category_google_taxonomy (
category_id integer references category ON UPDATE CASCADE ON DELETE CASCADE,
google_taxonomy_id integer references google_taxonomy ON UPDATE CASCADE ON DELETE CASCADE
);
Wenn ich versuche, die Tabelle zu füllen:
INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);
Ich erhalte folgende Fehlermeldung:
ERROR: permission denied for schema public
LINE 1: SELECT 1 FROM ONLY "public"."category" x WHERE "category_id"...
^
QUERY: SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x
Ich habe ein bisschen nachgelesen und schließlich ALL PRIVILEGES
aus Verzweiflung gewährt , aber es funktioniert immer noch nicht:
testing=# GRANT ALL PRIVILEGES ON public.category TO testing;
GRANT
testing=# \dp category_google_taxonomy
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+--------------------------+-------+-------------------------+--------------------------
public | category_google_taxonomy | table | testing=arwdDxt/testing |
: super=arwdDxt/testing
testing=# \dp category
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+----------+-------+------------------------+--------------------------
public | category | table | testing=arwdDxt/super | category_id:
: testing=arwx/super
(1 row)
Auf @ Daniels Vorschlag habe ich versucht GRANT USAGE ON schema public TO super;
, jetzt, wenn ich den INSERT
Befehl ausführe, erhalte ich:
ERROR: permission denied for relation category
CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
Hier ist der relevante Teil von \d
:
public | category | table | super
public | category_google_taxonomy | table | testing
quelle
GRANT ALL ON schema
, erhalte aber immer noch den gleichen Fehler wie zuvor.testing
ist der richtige Benutzer. Ich habe meinen ursprünglichen GRANT-Befehl hinzugefügt, er befand sich in der Tabelle und nicht in der gesamten Datenbank.testing
dass die Tabellen, auf die verwiesen wird, nicht gehören, siehe meine BearbeitungIch habe es geschafft, dies zu lösen, indem ich:
Danach
INSERT
verlief das reibungslos. Ich mache mir Sorgen, dass ich andere Dinge kaputt gemacht habe, indem ich den Besitzer von super gewechselt habe, aber das bleibt abzuwarten.quelle
Theoretisch verfügt ein Benutzer über ein Auswahlrecht für die übergeordnete Tabelle, das zum Einfügen in eine untergeordnete Tabelle ausreicht. Sie müssen nicht der Eigentümer der übergeordneten Tabelle sein. Ich glaube, es ist ein Fehler von postgresql.
quelle