triggers - 简单的 IBM DB2 触发器

标签 triggers insert db2 db2-400

我试图在 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/

相关文章:

jQuery - .trigger() 在 .load() 之后不起作用

mysql触发器更新设置空值而不是预期的数字

Java - DB2 连接问题

java - 批量选择记录 Spring JDBCTemplate

mysql - 如何为MySQL DB创建自动更新触发器?

sql - 根据之前的插入日期限制插入

php - Select id_value from db into array 复选框并将多个值从数组复选框插入到一列,并以逗号分隔

MySQL:为什么我不能将多个值插入到我的表中?

sql - 我是否缺少任何类型的 JOIN?

PHP/MySQL 检测表中价格列的变化