我试图在 DB2 (AS400) 中创建一个触发器,以便在另一个表上触发插入/删除操作时在表中插入/删除一行,但我需要使用有关触发器表的信息。
我想要的示例是这样的(表 1 和表 2 中的第 1 列在表 2 中是相同且唯一的):
CREATE TRIGGER MY_TRIGGER
AFTER INSERT OR DELETE ON DB1.TABLE1
BEGIN
IF INSERTING
THEN INSERT INTO DB1.TABLE2 (Col1, Col2) VALUES (Db1.TABLE1.Col1, 0);
ELSEIF DELETING
THEN DELETE FROM Db1.TABLE2 WHERE Col1=TABLE1.Col1;
END IF;
END
但这不起作用(它无法识别插入/删除语句中的 TABLE1.Col1
)。
它还会提示我一个错误(我猜),因为当在表 1 中插入第二行时,它会创建一个重复的键。当 Table2.Col1 时,如何避免错误(只需跳过插入)
已经存在?
最佳答案
尝试添加如下关联名称:
CREATE TRIGGER MY_TRIGGER
AFTER INSERT OR DELETE ON DB1.TABLE1
REFERENCING OLD ROW AS OLD
NEW ROW AS NEW
BEGIN
IF INSERTING
THEN INSERT INTO DB1.TABLE2 (Col1, Col2) VALUES (NEW.Col1, 0);
ELSEIF DELETING
THEN DELETE FROM Db1.TABLE2 WHERE Col1=OLD.Col1;
END IF;
END
触发器可以访问行的旧图像和新图像。您需要告诉它使用哪个。顺便说一句,只有更新操作才会填充旧图像和新图像。插入仅提供新图像,删除仅提供旧图像。人们可能认为 SQL 可以解决这个问题,但事实并非如此,您仍然必须明确地告诉它。
编辑这是实际使用的最终触发器(来自评论,谢谢@MarçalTorroella)
CREATE TRIGGER MY_TRIGGER
AFTER INSERT OR DELETE ON DB1.TABLE1
REFERENCING OLD ROW AS OLD
NEW ROW AS NEW
FOR EACH ROW MODE DB2ROW
BEGIN
DECLARE rowcnt INTEGER;
IF INSERTING THEN
SELECT COUNT(*)
INTO rowcnt
FROM DB1.TABL2
WHERE Col1 = NEW.Col1;
IF rowcnt = 0 THEN
INSERT INTO DB1.TABLE2 (Col1, Col2)
VALUES (NEW.Col1, 0);
END IF;
ELSEIF DELETING THEN
DELETE FROM Db1.TABLE2
WHERE Col1=OLD.Col1;
END IF;
END
关于triggers - 简单的 IBM DB2 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49779155/