使用
的替代解决方案
我已经在这个创建触发器上了一段时间...
在制作此触发器时,我正在使用IBM Data Studio 4.1.3。起初,我在结束陈述';';中遇到了问题。但是在IBM网站上说使用" X"并起作用。
我的主要问题,想知道为什么我会收到此消息:
"N.ITEMNAME" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=3.69.56
这也适用于其他所有:我在切换/交换名称时发现了这一点。
编辑器告诉我,声明中没有错误,但是在执行时会出现问题。
-- <ScriptOptions statementTerminator="x" />
CREATE TRIGGER DB2ADMIN.SUPPLIES_I
AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES
REFERENCING NEW TABLE AS n
OLD TABLE AS o
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
从 CREATE TRIGGER
语句中删除 TABLE
字:
CREATE TRIGGER DB2ADMIN.SUPPLIES_I
AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES
REFERENCING NEW AS n
OLD AS o
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
您不能以尝试方式引用表转换变量。想象一下,我们构建new
表如下所示。
可能:
with n(i) as (values 1, 2, 3)
select i
from n;
这是不可能的,您会收到相同的错误消息:
with n(i) as (values 1, 2, 3)
values (n.i);
使用FOR EACH STATEMENT
触发器
的替代解决方案如果您的表有一个键(一个或多个列),并且不包括更新的列QUANTITY
:
CREATE TRIGGER DB2ADMIN.SUPPLIES_I2
AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES
REFERENCING NEW TABLE AS n
OLD TABLE AS o
FOR EACH STATEMENT
INSERT INTO db2admin.tran_log
SELECT USER, CURRENT TIMESTAMP || ' ' || n.itemname || ' ( ' || o.itemid || ' ) from ' || CHAR(o.quantity) || ' to ' || CHAR(n.quantity)
FROM n, o
WHERE n.<key>=o.<key>