基本上,我希望能够使用该REVOKE
命令禁用UPDATE
and DELETE
,但我仍然希望表上的触发器更新我的行。
我的触发器在新插入的行上执行,并更新特定字段。所以我仍然想要这种行为,但他们不会被禁用REVOKE
或使用RULE
. (我看到了一个SO帖子)
有没有办法继续使用UPDATE
/INSERT
命令TRIGGERS
但禁用其余命令?
基本上,我希望能够使用该REVOKE
命令禁用UPDATE
and DELETE
,但我仍然希望表上的触发器更新我的行。
我的触发器在新插入的行上执行,并更新特定字段。所以我仍然想要这种行为,但他们不会被禁用REVOKE
或使用RULE
. (我看到了一个SO帖子)
有没有办法继续使用UPDATE
/INSERT
命令TRIGGERS
但禁用其余命令?
是的,这是可能的。
触发器以触发器函数的权限运行,默认情况下SECURITY INVOKER
,触发器函数以 的权限有效地执行current_user
,在您的情况下是插入行。
如果当前用户对您的触发器函数操作的表没有所需的权限,则您在基础表中的原始操作将出错。
但是,您可以使用SECURITY DEFINER
触发器函数让该函数以该函数的权限运行OWNER
。
如果你有一个超级用户拥有触发功能,它可以做任何事情——这可能是一个安全隐患。考虑手册中有关安全编写SECURITY DEFINER
函数的说明。
但更明智的做法是OWNER
使用触发器函数的必要权限来创建一个普通角色。您甚至可以在不登录的情况下创建一个“守护程序”角色,充当此类操作的特权包。然后,您将只授予此守护程序角色所需的权限(关于模式、表、序列...)。对于更复杂的设计,您应该在“组角色”中捆绑特权(同样,没有登录)并将这些组角色授予需要它的角色(在本例中为守护程序角色),有效地使它们成为“组成员”。我经常这样做。
考虑 dba.SE 上有关函数本身权限的相关答案: