我有两个表格。其中一个表格有一个外键,引用另一个表格中的序列字段。我已经将INSERT权限赋予了除所有者以外的角色,但是除非我授予包含引用字段的表格的所有者UPDATE权限,否则我仍然无法向包含外键的表格插入记录。
我不太理解为什么在这种情况下,所有者需要具有UPDATE权限,才能使另一个独立的角色(具有INSERT权限)能够插入一行。这可能有点令人困惑,因此我提供了一个简化版本的示例说明我的问题。
createuser -U postgres testowner -DIRS --pwprompt
createdb -U postgres -O testowner testdb
createuser -U postgres testupdater -DIRS --pwprompt
psql -d testdb -U testowner
CREATE TABLE a ( id serial PRIMARY KEY );
CREATE TABLE b ( a_id integer REFERENCES a(id) );
GRANT SELECT,INSERT ON ALL TABLES IN SCHEMA public TO testupdater;
GRANT USAGE,UPDATE ON SEQUENCE a_id_seq TO testupdater;
REVOKE INSERT, UPDATE ON ALL TABLES IN SCHEMA public FROM testowner;
INSERT INTO a VALUES (DEFAULT); -- as expected: ERROR: permission denied for relation a
\q
psql -d testdb -U testupdater
INSERT INTO a VALUES (DEFAULT);
SELECT id FROM a LIMIT 1; -- selects the first id (1)
INSERT INTO b VALUES (1); -- unexpected error: see below
\q
错误: 拒绝访问关系a
上下文: SQL语句 "SELECT 1 FROM ONLY "public"."a" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
然而,如果我给testowner授予UPDATE权限(GRANT UPDATE ON a TO testowner;
),上述插入操作就可以正常工作。为什么在这种情况下testowner需要UPDATE权限?
注意:GRANT UPDATE ON a TO testupdater;
无效;似乎我必须将UPDATE权限授予testowner角色。
a
以检查引用。 - David Underhill