使用IBM Data Studio创建DB2触发器遇SQLCODE=-206错误求助
解决DB2触发器SQLCODE=-206(列无效)的问题
嘿,我来帮你搞定这个触发器的报错!你遇到的SQLCODE=-206, SQLSTATE=42703错误,核心原因是触发器的引用语法用错了,和你之前调整的语句终止符没关系。
问题根源
你写的触发器是FOR EACH ROW模式(逐行触发,每更新一行就执行一次逻辑),但你在REFERENCING子句里用了NEW TABLE AS n和OLD TABLE AS o——这俩是给FOR EACH STATEMENT模式用的(针对整个更新语句的所有行集合)。在逐行触发器里,DB2无法识别n、o作为表集合的引用,自然找不到对应的列,所以才会报“列在当前环境无效”。
修正后的触发器代码
把REFERENCING部分改成逐行模式的语法,用NEW AS n和OLD AS o来引用当前行的新旧值就行,其他部分保持不变:
-- <ScriptOptions statementTerminator="x" /> CREATE TRIGGER DB2ADMIN.SUPPLIES_I AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES REFERENCING NEW AS n OLD AS o -- 这里是关键修改!去掉TABLE关键字 FOR EACH ROW MODE DB2SQL NOT SECURED BEGIN ATOMIC INSERT INTO db2admin.tran_log VALUES (USER, CURRENT TIMESTAMP || ' ' || n.itemname || ' ( ' || o.itemid || ' ) from ' || CHAR(o.quantity) || ' to ' || CHAR(n.quantity)); END
额外检查点
如果修正后还是报错,你可以快速确认下:
DB2ADMIN.SUPPLIES表确实存在ITEMNAME、ITEMID、QUANTITY这几个列,没有拼写错误db2admin.tran_log表的列数、数据类型,和你插入的值数量、类型完全匹配(比如USER是字符串类型,拼接后的时间+文本也要和对应的列类型兼容)
内容的提问来源于stack exchange,提问作者Xiaofan
相关产品推荐
相关产品推荐

