只能调用ALTER TRIGGER ...
来自 PSQL 语句,这并不总是很容易初始化。另外,为每个触发器编写几十行看起来不太好,两者都是:
if (:act = 1) ALTER TRIGGER ... ACTIVE;
else ALTER TRIGGER ... INACTIVE;
if (:act = 1) ...
如果我可以简单地调用:(以 0/1 作为参数)
update RDB$TRIGGERS set RDB$TRIGGER_INACTIVE=1
where RDB$TRIGGER_NAME in ('TRG_AUI_DETAILS','TRG_AU_INV','...');
但是在 Firebird 2.5 中这样做安全吗?或者官方的 ACTIVE/INACTIVATE 命令是否在后台执行其他操作? (我找到了这个想法:here)
附录,我决定使用:
EXECUTE BLOCK
...
FOR SELECT ...
S = 'ALTER TRIGGER ' || :trigger_name ||' ACTIVE';
execute statement :S;
所以基本上,为每个语句创建一个动态刺痛。
最佳答案
这在 Firebird 3.0 及更高版本中不再可能,因此我建议不要依赖此 hack,因为它会使迁移到新版本变得更加困难。然而,据我粗略地查看源代码来看,在 Firebird 2.5 中,它基本上会做同样的事情(不过,需要明确的是,我对此并不是 100% 确定,因为它看起来像触发器将被重新编译,当您执行直接表修改时不会发生这种情况)。
在 Firebird 3.0 中,引入了 DDL 触发器,直接修改系统表不会触发这些触发器,因此现在禁止直接修改系统表。
顺便说一句,我希望您知道 Firebird 2.5 不再受支持。我建议升级到受支持的版本。
关于triggers - 通过设置 : `update RDB$TRIGGERS set RDB$TRIGGER_INACTIVE=1 where ...` instead of `ALTER TRIGGER` ? 在 Firebird 中输入/激活触发器是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74303717/