在 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
);
Run Code Online (Sandbox Code Playgroud)
当我尝试填充表格时:
INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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
Run Code Online (Sandbox Code Playgroud)
我读了一点,最终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)
Run Code Online (Sandbox Code Playgroud)
根据@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"
Run Code Online (Sandbox Code Playgroud)
这是的相关部分\d:
public | category | table | super
public | category_google_taxonomy | table | testing
Run Code Online (Sandbox Code Playgroud)
Dan*_*ité 19
假设用户名是testing,你可能想要这样做:
GRANT ALL ON schema public TO testing;
Run Code Online (Sandbox Code Playgroud)
关于授予的注意事项ALL PRIVILEGES:您没有说明GRANT应用了此命令的内容。假设它是ON DATABASE...,它只是手段CONNECT,CREATE而TEMP特权,任何关于公共架构或任何其他包含的对象,这就是为什么它“不工作”。
编辑:当这还不够时
如果外键引用的表不属于testing,则其所有者还需要具有USAGE对架构特权才能查找引用的表。
从\dp(的结果\d肯定会告诉)结果并不明显,但如果category由super该用户拥有并且该用户对架构也没有特权,则需要为其分配:
GRANT USAGE ON schema public TO super;
Run Code Online (Sandbox Code Playgroud)