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
解决方案
从语句中删除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>
推荐阅读
- java - JAVA:使用 IntelliJ IDEA 在 JSP 中显示 mysql 数据
- python-3.x - 在 python 中使用 doctest 进行单元测试
- javascript - 将 JSON 字典中的多个值存储到数组中的脚本
- r - R中的随机抽样:限制重复次数
- go - 提供动态长度响应数据
- google-chrome - 为什么无法下载状态码 4XX 和 5XX 的文件
- c# - 如何使用图表 C# 编程计算 id 并按日期排序
- c# - 我在哪里可以看到 C# 中预定义方法的代码?
- azure - 如何在 azure kubernetes 集群(启用 RBAC)中为服务帐户分配权限?
- python - 此正则表达式是否失败,或者我是否需要修改正则表达式以支持“可选后跟”?