语句级触发器为何在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
相关产品推荐
相关产品推荐

