Postgres INSERT ERROR: Berechtigung für öffentliches Schema verweigert

9

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 PRIVILEGESaus 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 INSERTBefehl 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
Rudolf Vavruch
quelle

Antworten:

15

Angenommen, der Benutzername lautet testing, möchten Sie wahrscheinlich Folgendes tun:

GRANT ALL ON schema public TO testing;

Hinweis zur Gewährung ALL PRIVILEGES: Sie sagen nicht, worauf dieser GRANTBefehl angewendet wurde. Unter der Annahme , es war ON DATABASE..., es ist nur Mittel CONNECT, CREATEund TEMPPrivilegien, nichts über das öffentliche Schema oder ein anderes Objekt enthalten ist , weshalb es „nicht funktioniert“.

EDIT: wenn das nicht ausreicht

Wenn die Tabellen, auf die von den Fremdschlüsseln verwiesen wird, nicht Eigentum von sind testing, muss der Eigentümer auch über die USAGEBerechtigung für das Schema verfügen , um die referenzierten Tabellen nachschlagen zu können.

Es ist nicht aus dem Ergebnis von ersichtlich \dp(das Ergebnis von \dwürde sicher sagen), aber wenn categoryes Eigentum von ist superund dieser Benutzer auch keine Berechtigung für das Schema hat, müssten Sie es zuweisen mit:

GRANT USAGE ON schema public TO super;
Daniel Vérité
quelle
Ich habe das ausgeführt GRANT ALL ON schema, erhalte aber immer noch den gleichen Fehler wie zuvor. testingist der richtige Benutzer. Ich habe meinen ursprünglichen GRANT-Befehl hinzugefügt, er befand sich in der Tabelle und nicht in der gesamten Datenbank.
Rudolf Vavruch
@ Rudolf: ok, ich denke, es liegt daran, testingdass die Tabellen, auf die verwiesen wird, nicht gehören, siehe meine Bearbeitung
Daniel Vérité
Vielen Dank. Ich habe das versucht und jetzt habe ich einen neuen Fehler, der Fortschritt ist. Siehe oben.
Rudolf Vavruch
2

Ich habe es geschafft, dies zu lösen, indem ich:

ALTER TABLE category OWNER TO testing;

Danach INSERTverlief 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.

Rudolf Vavruch
quelle
Ist etwas schief gegangen?
VarunAgrawal
Das war vor ein paar Jahren, aber soweit ich mich erinnere, ist nichts schiefgegangen.
Rudolf Vavruch
Genial. Vielen Dank!
VarunAgrawal
0

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.

Jinglun Zhang
quelle