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
ユーザー名がtesting
であるとすると、おそらく次のようにします。
GRANT ALL ON schema public TO testing;
ALL PRIVILEGES
の付与に関する注意:このGRANT
コマンドが適用された内容については言いません。 ON DATABASE...
であると想定すると、CONNECT
、CREATE
およびTEMP
特権を意味するだけであり、パブリックスキーマやその他の含まれるオブジェクトについては何もないため、 "動作しません。」.
編集:それでは不十分な場合
外部キーによって参照されるテーブルがtesting
によって所有されていない場合、その所有者は、参照されるテーブルを検索するために、スキーマに対するUSAGE
特権も必要です。
\dp
の結果からは明らかではありませんが(\d
の結果は確かです)category
がsuper
によって所有されており、そのユーザーにも権限がない場合スキーマでは、次のように割り当てる必要があります。
GRANT USAGE ON schema public TO super;
私は何とかこれを解決することができました:
ALTER TABLE category OWNER TO testing;
その後、INSERT
は順調に進みました。所有者をスーパーから変更することで、他のものを壊したのではないかと心配していますが、それはまだわかりません。
理論的には、親テーブルに対する選択権限を持つユーザーは、子テーブルに挿入するのに十分です。親テーブルの所有者である必要はありません。私はそれがpostgresqlからのバグだと思います。