You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL触发器中区分INSERT、UPDATE、DELETE触发操作?

在触发器中区分INSERT/UPDATE/DELETE操作的两种方案

方案一:单个触发器内判断操作类型

SQL里没有INSERT(column)这类语法,但可以通过OLD和NEW记录的存在性来区分操作类型:

  • INSERT操作:old_rec为NULL(插入前无旧数据)
  • DELETE操作:new_rec为NULL(删除后无新数据)
  • UPDATE操作:old_rec和new_rec同时存在,可结合UPDATE(column)判断具体修改的字段

修改你的触发器代码如下:

ALTER TRIGGER "FR_CHANGES" AFTER INSERT, DELETE, UPDATE
ORDER 1 ON "DBA"."PERSONAL"
REFERENCING OLD AS old_rec NEW AS new_rec
FOR EACH ROW
BEGIN
    -- 处理UPDATE:仅当FIRSTNAME或LASTNAME被修改时记录
    IF UPDATE(FIRSTNAME) OR UPDATE(LASTNAME) THEN
        INSERT INTO FR_CHANGES (PNR_PERSONAL, CHANGE_TYPE) 
        VALUES (old_rec.PNR, 'update');
    END IF;

    -- 处理INSERT:old_rec不存在即为插入操作
    IF old_rec IS NULL THEN
        INSERT INTO FR_CHANGES (PNR_PERSONAL, CHANGE_TYPE) 
        VALUES (new_rec.PNR, 'insert');
    END IF;

    -- 处理DELETE:new_rec不存在即为删除操作
    IF new_rec IS NULL THEN
        INSERT INTO FR_CHANGES (PNR_PERSONAL, CHANGE_TYPE) 
        VALUES (old_rec.PNR, 'delete');
    END IF;
END;

注意:字符串常量要使用单引号',你原代码里的双引号"在多数SQL方言中用于引用标识符(表名、列名等),会导致语法错误,需替换。

方案二:为不同操作创建独立触发器

如果业务逻辑较复杂,拆分触发器能让代码更清晰、易维护:

  • 单独创建AFTER INSERT触发器处理插入逻辑
  • 单独创建AFTER DELETE触发器处理删除逻辑
  • 单独创建AFTER UPDATE触发器处理更新逻辑(结合UPDATE(column)判断字段)

示例INSERT触发器代码:

CREATE TRIGGER "FR_INSERT" AFTER INSERT
ORDER 1 ON "DBA"."PERSONAL"
REFERENCING NEW AS new_rec
FOR EACH ROW
BEGIN
    INSERT INTO FR_CHANGES (PNR_PERSONAL, CHANGE_TYPE) 
    VALUES (new_rec.PNR, 'insert');
END;

两种方案对比

  • 单个触发器:减少触发器数量,适合逻辑简单的场景,但分支判断会让复杂逻辑的可读性下降
  • 多个触发器:代码职责单一,可读性和可维护性更强,适合复杂业务场景,能避免不同操作逻辑互相干扰

内容的提问来源于stack exchange,提问作者user1119859

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:20:24