在使用环境的环境中无效。,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

这也适用于所有其他:o.itemid、o.quantity 和 n.quantity。我在彼此切换/交换名称时发现了这一点。

编辑告诉我它在语句中没有错误,但是在执行时出现了问题。

-- <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

标签: db2

解决方案


从语句中删除TABLE单词:CREATE TRIGGER

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>

推荐阅读