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

语句级触发器为何在DML操作中表现如行级触发器?

问题原因分析

你的触发器确实是语句级触发器,之所以看起来像行级,是因为不同测试脚本的执行逻辑差异导致的,具体拆解如下:

1. 语句级触发器的核心规则

语句级触发器的触发逻辑是:每执行一条完整的DML语句(INSERT/UPDATE/DELETE),触发器就执行一次,和这条语句影响的行数无关。

2. 第一个测试脚本的触发逻辑

你的第一个测试代码是一个PL/SQL块,里面包含了3条独立的INSERT语句:

BEGIN
  INSERT INTO CITIZENS VALUES (2, 'JOSH', 'MARK', 40); -- 第1条独立DML语句
  INSERT INTO CITIZENS VALUES (3, 'MANI', 'RAJ', 38); -- 第2条独立DML语句
  INSERT INTO CITIZENS VALUES (4, 'VIGNESH', 'KUMAR', 34); -- 第3条独立DML语句
END;
/

这里的3条INSERT是3个完全独立的DML操作,每一条都会触发一次你的语句级触发器,所以trigger_log表会新增3条记录——这不是触发器变成了行级,而是你执行了3次独立的INSERT语句,每次都触发了一次触发器。

3. 第二个测试脚本的触发逻辑

你的第二个测试代码是INSERT ALL语句:

INSERT ALL
  INTO CITIZENS VALUES (2, 'JOSH', 'MARK', 40)
  INTO CITIZENS VALUES (3, 'MANI', 'RAJ', 38)
  INTO CITIZENS VALUES (4, 'VIGNESH', 'KUMAR', 34)
SELECT * FROM dual;

INSERT ALL是单条DML语句,哪怕它一次性插入3行数据,语句级触发器也只会触发一次。执行这段代码后,trigger_log表只会新增1条记录,这才是语句级触发器的正常表现。

验证方法

你可以单独执行第二个INSERT ALL脚本,查看trigger_log的记录数,就能直观确认触发器的语句级属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:49:56