如何防止在没有插入行时触发插入触发器?

时间:2010-06-25 13:11:09

标签: oracle triggers

我有一个TABLE1。在这个表上我创建了一个触发器:AFTER INSERT OR UPDATE OR DELETE

现在,如果我执行的插入没有插入任何内容,触发器仍会被触发:

insert into TABLE1 select * from TABLE1 where 1=0;

此查询将插入NO ROWS,但触发器仍然被触发。

有没有办法避免这种情况?这是正常行为吗?

3 个答案:

答案 0 :(得分:4)

是的,这是正常行为。可以避免,但这样做需要3个触发器:

  1. BEFORE触发器,用于将包布尔变量设置为FALSE
  2. FOR EACH ROW触发器,在插入行时将变量设置为TRUE
  3. 您拥有的AFTER触发器,您现在可以在执行其操作之前检查变量的值。
  4. 听起来有点矫枉过正?也许它是:用触发器试图实现什么?

答案 1 :(得分:3)

这是正常行为,Oracle期望插入行,因此即使没有插入行,它也会触发BEFORE INSERT和AFTER INSERT触发器。 AFTER触发器的目的之一是在语句成功后执行某些操作。这个陈述成功了:)

您可以计算受包变量影响的行数:

  • 在BEFORE INSERT触发器中将mypackage.table1_nb_ins变量设置为0
  • 在AFTER INESRT FOR EACH ROW触发器中递增计数器

然后在计数器大于0的情况下执行AFTER INSERT逻辑

答案 2 :(得分:0)

行触发器

每次表受到触发语句的影响时,都会触发行触发器。例如,如果UPDATE语句更新表的多行,则对受UPDATE语句影响的每一行触发一次行触发器。如果触发语句不影响任何行,则不会运行行触发器。

https://docs.oracle.com/cd/B19306_01/server.102/b14220/triggers.htm