DB2中能否用单触发器实现Disponibilita更新后的两项操作?
单个DB2触发器实现Disponibilita更新后同步Promozioni的NumProdotti
完全可以用单个触发器实现你的需求,不需要拆成两个。你的原代码无法运行的核心问题是:DB2的行级触发器中包含多个DML语句时,必须用BEGIN...END复合语句块包裹,不能直接写多个独立的UPDATE。
修正后的触发器代码
-- 先设置分隔符(如果在DB2命令行/CLP执行,避免分号提前结束触发器定义) -- 执行完触发器后记得改回分号 # CREATE OR REPLACE TRIGGER AggiornaNumProdotti AFTER UPDATE ON Disponibilita REFERENCING OLD AS O NEW AS N FOR EACH ROW BEGIN -- 对旧PID对应的Promozioni计数减1(排除新旧PID相同的情况) IF O.PID IS NOT NULL AND O.PID <> N.PID THEN UPDATE PROMOZIONI p SET NumProdotti = NumProdotti - 1 WHERE p.PID = O.PID; END IF; -- 对新PID对应的Promozioni计数加1(排除新旧PID相同的情况) IF N.PID IS NOT NULL AND N.PID <> O.PID THEN UPDATE PROMOZIONI p SET NumProdotti = NumProdotti + 1 WHERE p.PID = N.PID; END IF; END# -- 改回默认分隔符 ;
关键逻辑说明
- 加入
BEGIN...END块包裹两个UPDATE操作,符合DB2复合触发器语句的要求。 - 增加
O.PID <> N.PID的判断:如果更新前后PID没有变化,没必要执行加减操作,避免无意义的数据库写入,提升效率。 - 覆盖所有场景:
- 当Disponibilita的记录从某个PID切换到另一个PID时,旧PID对应的商品数减1,新PID对应的加1。
- 当旧PID为空、新PID不为空时,只执行加1操作。
- 当新PID为空、旧PID不为空时,只执行减1操作。
注意事项
如果是在DB2命令行工具(CLP)中执行这段代码,必须先修改语句分隔符(比如改成#),因为触发器内部的分号会被CLP当成整个语句的结束符,导致触发器定义不完整。执行完触发器后再把分隔符改回默认的;即可。
内容的提问来源于stack exchange,提问作者ric
相关产品推荐
相关产品推荐

