SQL Server更新触发器转换为Firebird兼容版本的适配难题求助
Firebird 等价触发器实现
核心适配说明
- 替换SQL Server的
INSERTED临时表为Firebird触发器内置的NEW(更新后行)、OLD(更新前行)上下文变量 - 用
NEW.STR_ZONE_LIBRE IS DISTINCT FROM OLD.STR_ZONE_LIBRE替代SQL Server的UPDATE(STR_ZONE_LIBRE)列修改判断 - 移除原始代码中未被使用的
@num_interv冗余变量,简化多表关联逻辑 - 行级触发器逐行处理更新行,修复SQL Server原始代码多更新行时仅取最后一个
LIEN_UI的隐式缺陷(如需完全保留原行为可参考后续调整说明) - 移除SQL Server专属的库名、Schema前缀,适配Firebird同库对象访问规则
适用于Firebird 2.0+ 的实现代码
CREATE OR ALTER TRIGGER IDSOFT_INTERV_UI ACTIVE AFTER UPDATE ON T_ZONES_LIBRES_UI FOR EACH ROW AS BEGIN -- 未修改STR_ZONE_LIBRE直接退出 IF (NEW.STR_ZONE_LIBRE IS NOT DISTINCT FROM OLD.STR_ZONE_LIBRE) THEN RETURN; -- 仅处理INDICE_ZONE_LIBRE=20的行 IF (NEW.INDICE_ZONE_LIBRE <> 20) THEN RETURN; -- 执行业务更新 UPDATE T_LIGNE_BT a SET cle_element = e.NUM_INTERV FROM T_BT b INNER JOIN T_UI c ON b.CLE_UI = c.NUM_UI INNER JOIN T_INTERV e ON e.NOM_INTERV = NEW.STR_ZONE_LIBRE WHERE a.CLE_BT = b.NUM_BT AND c.NUM_UI = NEW.LIEN_UI AND b.CLE_IP IS NOT NULL AND b.CLE_IP <> 100000 AND a.TYPE_LIGNE_BT LIKE 'I'; END
适用于Firebird 1.5 及更早版本的兼容实现
CREATE OR ALTER TRIGGER IDSOFT_INTERV_UI ACTIVE AFTER UPDATE ON T_ZONES_LIBRES_UI FOR EACH ROW AS BEGIN IF (NEW.STR_ZONE_LIBRE IS NOT DISTINCT FROM OLD.STR_ZONE_LIBRE) THEN RETURN; IF (NEW.INDICE_ZONE_LIBRE <> 20) THEN RETURN; UPDATE T_LIGNE_BT a SET cle_element = ( SELECT e.NUM_INTERV FROM T_BT b INNER JOIN T_UI c ON b.CLE_UI = c.NUM_UI INNER JOIN T_INTERV e ON e.NOM_INTERV = NEW.STR_ZONE_LIBRE WHERE a.CLE_BT = b.NUM_BT AND c.NUM_UI = NEW.LIEN_UI AND b.CLE_IP IS NOT NULL AND b.CLE_IP <> 100000 AND a.TYPE_LIGNE_BT LIKE 'I' ) WHERE EXISTS ( SELECT 1 FROM T_BT b INNER JOIN T_UI c ON b.CLE_UI = c.NUM_UI INNER JOIN T_INTERV e ON e.NOM_INTERV = NEW.STR_ZONE_LIBRE WHERE a.CLE_BT = b.NUM_BT AND c.NUM_UI = NEW.LIEN_UI AND b.CLE_IP IS NOT NULL AND b.CLE_IP <> 100000 AND a.TYPE_LIGNE_BT LIKE 'I' ); END
完全保留SQL Server原始隐式行为的调整说明
如果需要完全复现原始代码多更新行时仅处理最后一个LIEN_UI的逻辑,需将触发器改为语句级,使用FOR EACH STATEMENT,并通过系统上下文获取本次更新的所有行存储为临时结果集后取最后一条LIEN_UI执行更新,该场景适配成本较高,仅在有特殊兼容需求时使用。
内容的提问来源于stack exchange,提问作者Charly Thomas
相关产品推荐
相关产品推荐

