是的,完全有可能。
1.一般不允许UPDATe
以A
我将特权运行:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
这就使得诸如
postgres忽略这些低限制的超级用户。抓住那些你的触发功能上里面
A有
pg_has_role():
IF pg_has_role('postgres', 'member') THEN RETURN NULL;END IF;postgres实际的超级用户在哪里。注意:这也捕获其他超级用户,因为它们是每个角色的成员,甚至其他超级用户也是如此。
您可以采用类似的方式(替代该
REVOKE方法)来捕获非超级用户。
2.允许UPDATE
守护程序角色
创建一个非登录角色,该角色可以更新
A:
CREATE ROLE a_update NOLOGIN;-- GRANT USAGE ON SCHEMA xyz TO a_update; -- may be needed, tooGRANT UPDATE ON TABLE A TO a_update;
表上创建触发器的功能
B和
C, 拥有 此守护进程的作用,并用
SECURITY DEFINER。细节:
- 有没有一种方法可以禁用更新/删除,但仍允许触发器执行更新/删除?
添加到的触发功能
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 UPDATECASCADE。



