基本上,我希望能够使用REVOKE
命令来禁用UPDATE
和DELETE
,但我仍然希望表上的触发器能够更新我的行。
我的触发器对新插入的行执行,并更新特定字段。所以我仍然希望这种行为,但不会被REVOKE
或RULE
禁用。 (I saw an SO post)
有没有办法继续使用UPDATE
中的INSERT
/ TRIGGERS
命令但禁用其余命令?
答案 0 :(得分:15)
是的,这是可能的。
触发器使用触发器功能的特权运行,默认为SECURITY INVOKER
,这意味着触发器功能可以使用current_user
的特权有效执行,在您的情况下是插入行的。{ / p>
如果当前用户没有触发器功能所操作的表所需的权限,则基础表中的原始操作将会出错。
但是,您可以使用SECURITY DEFINER
作为触发器功能,让此功能以该功能的OWNER
权限运行。
如果您拥有超级用户拥有触发器功能,它可以执行所有 - 这可能存在安全隐患。请考虑手册中有关Writing SECURITY DEFINER
Functions Safely。
但是,只使用触发器功能的必要特权OWNER
来做一个明确的角色是明智的。您甚至可以在不登录的情况下创建“守护程序”角色,充当此类操作的权限包。然后,您只需要为此守护程序角色授予所需的权限(在模式,表,序列......上)。对于更复杂的设计,您应该将权限捆绑在“组角色”中(同样,无需登录),并将这些组角色授予需要它的角色(在此示例中为守护进程角色),从而有效地使它们成为“组成员”。我做了很多。
还要考虑this related question on dba.SE有关函数本身的特权。