2010-06-25 135 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