2010-06-25 138 views
3

我有一个TABLE1。在这个表我创建了一个触发器:插入,更新或AFTER DELETE如何防止未插入行时触发插入触发器?

现在,如果我做了一个插件,该插件不插入任何东西,触发仍将被解雇:

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

这个查询将插入没有行,但触发器仍然被解雇。

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

回答

4

是的,这是正常的行为。能够避免,虽然这样做需要具有3个触发器:

  1. BEFORE触发器到封装布尔变量设置为FALSE
  2. 甲FOR EACH ROW触发到变量设置为TRUE时,行被插入
  3. 您有AFTER触发器,现在您可以在执行其操作之前检查变量的值。

听起来像是矫枉过正?也许是:试图用你的触发器实现什么?

+0

+1:打我吧:) – 2010-06-25 13:28:53

+0

其实,我只是增加了对每一行和它解决了我的问题。我只需要在另一个表格中更新日期。即使每插入一行都触发一次触发器,在这种情况下,由于每次插入的行很少,因此无关紧要。但谢谢你的答案。我会尝试如果我有性能问题。 – guigui42 2010-06-25 13:30:51

3

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

你可以指望的影响有一个包变量的行数:

  • 设置mypackage.table1_nb_ins变量为0,在BEFORE INSERT触发器
  • 增量在后的反抽INESRT FOR EACH ROW触发

,然后执行你的AFTER INSERT逻辑,如果你的计数器大于0

+0

+1了不起的头脑...... ;-) – 2010-06-25 13:30:33