我有一个TABLE1。在这个表上我创建了一个触发器:AFTER INSERT OR UPDATE OR DELETE
现在,如果我执行的插入没有插入任何内容,触发器仍会被触发:
insert into TABLE1 select * from TABLE1 where 1=0;
此查询将插入NO ROWS,但触发器仍然被触发。
有没有办法避免这种情况?这是正常行为吗?
答案 0 :(得分:4)
是的,这是正常行为。可以避免,但这样做需要3个触发器:
听起来有点矫枉过正?也许它是:用触发器试图实现什么?
答案 1 :(得分:3)
这是正常行为,Oracle期望插入行,因此即使没有插入行,它也会触发BEFORE INSERT和AFTER INSERT触发器。 AFTER触发器的目的之一是在语句成功后执行某些操作。这个陈述成功了:)
您可以计算受包变量影响的行数:
mypackage.table1_nb_ins
变量设置为0 然后在计数器大于0的情况下执行AFTER INSERT逻辑
答案 2 :(得分:0)
行触发器
每次表受到触发语句的影响时,都会触发行触发器。例如,如果UPDATE语句更新表的多行,则对受UPDATE语句影响的每一行触发一次行触发器。如果触发语句不影响任何行,则不会运行行触发器。
https://docs.oracle.com/cd/B19306_01/server.102/b14220/triggers.htm