【发布时间】:2010-12-12 20:56:18
【问题描述】:
我有两张桌子。一个有一个外键引用另一个表中的序列字段。我已将 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
ERROR: permission denied for relation a
CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."a" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
但是,如果我将 UPDATE 权限 (GRANT UPDATE ON a TO testowner;) 还给 testowner,则上述插入工作。为什么在这种情况下测试所有者需要 UPDATE?
注意:GRANT UPDATE ON a TO testupdater; 没有帮助;看来我必须对 testowner 角色进行 GRANT UPDATE。
【问题讨论】:
-
如果您授予用户对 testowner 的读取权限,它是否有效? testupdater 上的插入需要读取 testowner 中的外键值,以确保插入有效。
-
@Macy 我从未撤销过
testowner角色的 SELECT 权限。testupdater也被授予 SELECT 权限,因此它似乎应该能够读取表a以检查参考。 -
这里运行良好,没有意外错误。
-
@Frank Weird - 我使用的是 v9.0;你在用什么?
标签: sql postgresql permissions