2012-12-12 56 views
2

遞歸觸發器調用我有一個更新語句,嵌套在一個更新觸發器:如何防止在DB2

CREATE TRIGGER "BAD_RECURSIVE_TRIGGER" 
    AFTER UPDATE ON "MYTABLE" 
    REFERENCING NEW AS NEW_ROW 
    FOR EACH ROW 
WHEN (NEW_ROW.ORDER IS NOT NULL) 
BEGIN ATOMIC 
    IF <SOMECONDITION> THEN 
    UPDATE "MYTABLE" SET ORDER=ORDER+1 // This "update" fires the recursion. 
    WHERE <OTHERCONDITION> 
END IF; 
END; 

我想,以防止觸發的遞歸執行,這是DB2(V9.7) ,我已經看到了SQL-Server和類似的問題Oracle數據庫:

Prevent recursive trigger in PostgreSQL

How do I prevent a database trigger from recursing?

但我不能找到一種方法來preve通過DB2進行管理。有沒有辦法阻止通過DB2的遞歸觸發器調用?

+0

它是否必須是「後更新」?如果觸發器在實際更新之前發生並在此時修改了「ORDER」,會發生什麼情況?我假設你只想更新'當前'行,但是該語句將更新_entire_表...或者,只有在'ORDER' _ hasn't_從當前值改變時才更新(如果新值與舊的表內值相同)。 –

+0

@ Clockwork-Muse,期望的行爲是: 如果「此記錄得到更新」,那麼「更新其他記錄」(來自同一張表)。問題在於,在第一個「更新觸發器」中,它會執行另一次更新,再次觸發觸發器。 而且似乎沒有辦法知道是否是第一個電話,這將解決我的問題。 我已經發布了另一個問題:http://stackoverflow.com/questions/13845776/db2-equivalent-of-sql-servers-trigger-nestlevel,但我仍然願意接受任何其他好的替代方案它。 –

+0

... _你爲什麼要更新表格中的其他記錄?你試圖解決的實際問題是什麼?這個陳述將會是一個巨大的瓶頸,因爲你最終將對該表進行串行訪問。 –

回答

0

CREATE TRIGGER NO CASCADE BEFORE UPDATE ...

+0

不幸的是,在裏面創建一個「update update」觸發器是不可能的,並且在裏面創建一個「update trigger」的「after trigger」不允許使用「NO CASCADE」語句(http:// pic.dhe.ibm.com/infocenter/db2luw/v9r7/),這很令人傷心,因爲它們似乎特別想避免我正在尋找的行爲=( –

0

你不想使用整數類型列這樣的事情,因爲它需要(最終)重新排序在所有其他項目給定'組'。

當您想要允許條目重新定位時,請使用浮動類型,而不是。這將允許通過簡單地修改所需的條目來改變順序。
隨着沿着這些路線聲明:

UPDATE Example SET ordering = (((SELECT COALESCE(ordering, FLOAT_MAX_VALUE) 
           FROM Example 
           WHERE id = @entry_above_insertion_point) 
           - 
           (SELECT COALESCE(ordering, FLOAT_MIN_VALUE) 
           FROM Example 
           WHERE id = @entry_below_insertion_point)) 
          /2) 
           + (SELECT COALESCE(ordering, FLOAT_MIN_VALUE) 
            FROM Example 
            WHERE id = @entry_below_insertion_point) 
WHERE id = @entry 

這將會把兩個電流項之間的入口「中途」。由於浮點運行的方式,你想在0處開始你的值;不確定是否需要規範化數據。