简单的IBM DB2 Trigger

时间:2018-04-11 15:35:35

标签: triggers insert db2 db2-400

我在触发器世界中完全是新手。我正在尝试在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已经存在时,我怎么能避免错误(只是跳过插入)?

先谢谢了。

1 个答案:

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