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

时间:2013-07-26 16:32:16

标签: postgresql triggers privileges

基本上,我希望能够使用REVOKE命令来禁用UPDATEDELETE,但我仍然希望表上的触发器能够更新我的行。

我的触发器对新插入的行执行,并更新特定字段。所以我仍然希望这种行为,但不会被REVOKERULE禁用。 (I saw an SO post

有没有办法继续使用UPDATE中的INSERT / TRIGGERS命令但禁用其余命令?

1 个答案:

答案 0 :(得分:15)

是的,这是可能的。

触发器使用触发器功能的特权运行,默认为SECURITY INVOKER,这意味着触发器功能可以使用current_user的特权有效执行,在您的情况下是插入行的。{ / p>

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

但是,您可以使用SECURITY DEFINER作为触发器功能,让此功能以该功能的OWNER权限运行。

如果您拥有超级用户拥有触发器功能,它可以执行所有 - 这可能存在安全隐患。请考虑手册中有关Writing SECURITY DEFINER Functions Safely

的说明

但是,只使用触发器功能的必要特权OWNER来做一个明确的角色是明智的。您甚至可以在不登录的情况下创建“守护程序”角色,充当此类操作的权限包。然后,您只需要为此守护程序角色授予所需的权限(在模式,表,序列......上)。对于更复杂的设计,您应该将权限捆绑在“组角色”中(同样,无需登录),并将这些组角色授予需要它的角色(在此示例中为守护进程角色),从而有效地使它们成为“组成员”。我做了很多。

还要考虑this related question on dba.SE有关函数本身的特权。