‬‎ <column name> ‪is‬‎ ‪not‬‎ ‪valid‬‎ ‪in‬‎ ‪the‬‎ ‪context‬‎ ‪where‬‎ ‪it‬‎ ‪is‬‎ ‪used‬‎.‪‬

  • 本文关键字:is context the where in it used valid name db2
  • 更新时间 :
  • 英文 :


我已经在这个创建触发器上了一段时间...

在制作此触发器时,我正在使用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>

相关内容

最新更新