是否可以允许表的非所有者禁用表的触发器?

Szy*_*iec 5 postgresql trigger permissions

我想要一个不是表所有者的用户,授予关闭和打开触发器的权限。可以做到吗?

dez*_*zso 8

作为表的所有者,您可以创建一个函数(或者,如果您使用的是 Postgres 11 或更高版本,则可以创建一个procedure)来禁用您选择的触发器,例如:

CREATE OR REPLACE FUNCTION disable_this_trigger() 
RETURNS void 
LANGUAGE SQL 
AS $$
ALTER TABLE something DISABLE TRIGGER this_trigger;
$$ SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)

然后向您的用户授予必要的权限以执行该功能:

GRANT EXECUTE ON FUNCTION disable_this_trigger() TO alice;
Run Code Online (Sandbox Code Playgroud)

现在alice将能够禁用那个触发器。您可以使用开关(例如开/关)扩展此功能以实现启用,或者创建一个与此功能相反的类似功能。

诀窍在于SECURITY DEFINER。它使函数以定义(创建)函数的用户的权限运行。如上所述,这必须是表的所有者,因为只有它(和超级用户)才能禁用它的触发器。