有没有办法禁用更新/删除,但仍然允许触发器执行它们?

问题描述 投票:0回答:1

基本上,我希望能够使用

REVOKE
命令来禁用
UPDATE
DELETE
,但我仍然希望表上的触发器来更新我的行。

我的触发器对新插入的行执行,并更新特定字段。所以我仍然想要这种行为,但是它们不会被

REVOKE
RULE
禁用吗? (我看到了一个SO帖子

有没有办法继续使用

UPDATE
中的
INSERT
/
TRIGGERS
命令但禁用其余命令?

postgresql triggers privileges
1个回答
21
投票

是的,这是可能的。

触发器以触发器函数在创建时的权限运行,默认为

SECURITY INVOKER
,这意味着触发器函数以
current_user
的权限有效执行,在您的情况下是插入行的权限。

请注意,仅在触发器创建时检查函数本身的权限。参见:

如果当前用户没有您的触发器函数所操作的表所需的权限,则您在基础表中的原始操作将出错。

但是,您可以使用

SECURITY DEFINER
作为触发函数,让该函数以函数
OWNER
的权限运行。

如果您有一个超级用户拥有触发功能,它可以做一切 - 这是一个潜在的安全隐患。请考虑手册中关于“编写

SECURITY DEFINER
安全运行”的说明。 更明智的做法是创建一个非超级用户角色,只具有触发函数的必要权限

OWNER

。您可以创建一个无需登录的“守护进程”角色来充当权限包。仅向此守护进程角色授予所需的权限(关于架构、表、序列...)。对于更复杂的设计,将权限捆绑在“组角色”(同样,无需登录)中,并将这些组角色授予需要它的角色(本例中的守护进程角色),从而有效地使它们成为“组的成员”。我经常这样做。

    

© www.soinside.com 2019 - 2024. All rights reserved.