web-dev-qa-db-ja.com

Postgres INSERT ERROR:スキーマpublicの許可が拒否されました

Postgresでは、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
);

テーブルにデータを入力しようとすると:

INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);

次のエラーが発生します。

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

私は少し読んで、最終的に憤慨からALL PRIVILEGESを許可しましたが、それでも機能しません。

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)

@Danielの提案に基づいてGRANT USAGE ON schema public TO super;を試しましたが、INSERTコマンドを実行すると次のようになります。

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"

\dの関連部分は次のとおりです。

public | category                               | table    | super
public | category_google_taxonomy               | table    | testing
8
Rudolf Vavruch

ユーザー名がtestingであるとすると、おそらく次のようにします。

GRANT ALL ON schema public TO testing;

ALL PRIVILEGESの付与に関する注意:このGRANTコマンドが適用された内容については言いません。 ON DATABASE...であると想定すると、CONNECTCREATEおよびTEMP特権を意味するだけであり、パブリックスキーマやその他の含まれるオブジェクトについては何もないため、 "動作しません。」.

編集:それでは不十分な場合

外部キーによって参照されるテーブルがtestingによって所有されていない場合、その所有者は、参照されるテーブルを検索するために、スキーマに対するUSAGE特権も必要です。

\dpの結果からは明らかではありませんが(\dの結果は確かです)categorysuperによって所有されており、そのユーザーにも権限がない場合スキーマでは、次のように割り当てる必要があります。

GRANT USAGE ON schema public TO super;
14
Daniel Vérité

私は何とかこれを解決することができました:

ALTER TABLE category OWNER TO testing;

その後、INSERTは順調に進みました。所有者をスーパーから変更することで、他のものを壊したのではないかと心配していますが、それはまだわかりません。

2
Rudolf Vavruch

理論的には、親テーブルに対する選択権限を持つユーザーは、子テーブルに挿入するのに十分です。親テーブルの所有者である必要はありません。私はそれがpostgresqlからのバグだと思います。

0
Jinglun Zhang