使用DB2 oncloud(LUW),我希望在一行中的任何其他值更新之后,更新该行中的单个列值。
下面的AFTER INSERT语句有效
CREATE TRIGGER CENTRAL_REPOSITORY.TR_DATABASE_OBJECT_INS_CDT
AFTER INSERT ON CENTRAL_REPOSITORY.DATABASE_OBJECT
REFERENCING NEW AS N_ROW
FOR EACH ROW
UPDATE CENTRAL_REPOSITORY.DATABASE_OBJECT SET create_datetime = current_timestamp
where id = N_ROW.id
以下AFTER UPDATE不
CREATE TRIGGER CENTRAL_REPOSITORY.TR_DATABASE_OBJECT_UPD_UDT
AFTER UPDATE ON CENTRAL_REPOSITORY.DATABASE_OBJECT
REFERENCING NEW AS N_ROW
FOR EACH ROW
UPDATE CENTRAL_REPOSITORY.DATABASE_OBJECT SET update_datetime = current_timestamp
where id = N_ROW.id;
我在尝试对表运行插入操作后得到的错误是
“触发器“CENTRAL_REPOSITO”中的触发SQL语句出错。为该错误返回的信息包括SQLCODE“-724”、SQLSTATE“54038”和消息标记“CENTRAL_REPOSITORY.TR_DATABASE_OBJECT_UPD_".. SQLCODE= -723,SQLSTATE=09000,DRIVER=4.32.28”
2条答案
按热度按时间lstz6jyr1#
您不应该使用AFTER触发器,
使用BEFORE触发器...
EDIT您可以考虑将列定义为“行更改时间戳”,那么您根本不需要为触发器而烦恼。
ckocjqey2#
当Db2发现如果触发器触发可能会激活多个对象时,您会得到此错误(SQLCODE = -724),也称为“SQL 0724 N”,这通常是因为表中有其他触发器或RI,它们的条件不互斥或可能导致递归。
看看文件
其中包括以下建议:
解释
当触发器激活另一个触发器(可能通过引用约束删除规则)或包含SQL的例程调用另一个例程时,会发生间接SQL的级联。对于触发器,此级联的深度限制为16,对于例程,此级联的深度限制为64。
请注意,在递归情况下,触发器包括直接或间接导致同一触发器被激活的触发SQL语句,或者例程直接或间接调用自身,这是级联的一种形式,如果没有条件防止级联超过限制,则很可能导致此错误。
对象类型是TRIGGER、FUNCTION、METHOD或PROCEDURE之一。
指定的对象名称是在第十七级级联中激活的对象之一。
用户响应
从收到此错误的语句所激活或调用的对象开始。如果这些对象中有任何对象是递归的,请确保存在某种条件,可防止该对象被激活或调用的次数超过限制所允许的次数。如果这不是问题的原因,请跟踪被激活或调用的对象链,以确定超出级联限制的链。