triggers - 通过设置 : `update RDB$TRIGGERS set RDB$TRIGGER_INACTIVE=1 where ...` instead of `ALTER TRIGGER` ? 在 Firebird 中输入/激活触发器是否安全

标签 triggers firebird firebird2.5 firebird-psql

只能调用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/

相关文章:

delphi - Delphi-Firebird数据迁移-不同的字符集

SQL 2008 Express (R2) : Creating an UPDATE trigger to update a table on another server?

mysql - 如何触发一个表并更新同一个表?

sql - 使用 IIF 和 SIMILAR TO 在 INSERT 中将 char 转换为整数

sql - Firebird 如何选择匹配集合中所有项目的 id

java - Estado HTTP 500...无法打开连接

triggers - 更新 firebird 触发器中的生成器

javascript - jQuery .trigger() 不发送额外参数

sql-server - MSSQL : What happens when an error occurs during trigger execution?

c# - Visual Studio 2015 中用于 Firebird 的 ADO.NET 数据提供程序