在 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
答案1
假设用户名是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;
答案2
我设法通过以下方式解决了这个问题:
ALTER TABLE category OWNER TO testing;
之后一切INSERT
顺利。我担心我可能因为将所有者从超级用户更改为超级用户而破坏了其他东西,但这还有待观察。
答案3
理论上,具有父表 select 权限的用户足以插入子表。不需要是父表的所有者。我相信这是 postgresql 的一个错误。