是的,完全有可能。
1.一般不允许UPDATE
to A
我会以特权进行操作:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
这使得超级用户如postgres
谁忽视了这些低级的限制。抓住你的触发函数中的那些A
with pg_has_role() https://www.postgresql.org/docs/current/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
END IF;
Where postgres
是一个真正的超级用户。注意:这也会捕获其他超级用户,因为他们是每个角色的成员,甚至是其他超级用户。
您可以以类似的方式捕获非超级用户(替代REVOKE
方法)。
2. 允许UPDATE
对于守护进程角色
创建非登录角色,允许更新A
:
CREATE ROLE a_update NOLOGIN;
-- GRANT USAGE ON SCHEMA xyz TO a_update; -- may be needed, too
GRANT UPDATE ON TABLE A TO a_update;
在表上创建触发器函数B
and C
, owned通过这个守护进程角色和SECURITY DEFINER
。细节:
- 有没有办法禁用更新/删除但仍然允许触发器执行它们? https://stackoverflow.com/questions/17886529/is-there-a-way-to-disable-updates-deletes-but-still-allow-triggers-to-perform-th/17887101#17887101
添加到触发函数上A
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
RETURN NEW;
END IF;
对于简单的 1:1 依赖关系,您还可以使用外键约束(另外)使用ON UPDATE CASCADE https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-FK.