我在触发器世界中完全是新手。我正在尝试在DB2(AS400)中创建一个触发器,以便在另一个表上触发插入/删除时将一行插入/删除,但我需要使用有关该triger表的信息。
我想要的例子就是这样,(表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已经存在时,我怎么能避免错误(只是跳过插入)?
先谢谢了。
答案 0 :(得分:2)
尝试添加如下相关名称:
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
触发器可以访问行的旧图像和新图像。你需要告诉它使用哪个。顺便说一句,只有更新操作会填充旧图像和新图像。 Insert仅提供新图像,而delete仅提供旧图像。有人可能会认为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