2015-08-03 41 views
1

我有3場postgresql觸發可能的infinte循環?

id, name , value 

我想添加一個第四科拉姆calcValue表。 calcValue的計算基於整個表格中的文件value,將其更改爲一行可能會導致所有其他變化。

我想寫一個更新calcValue的觸發器,每當表中有insert, delete or update

我擔心的是觸發器本身會有一個Update命令。它會不會再觸發這個觸發器?我會陷入無限循環嗎?

爲了更好地描述它:

CREATE TRIGGER x 
    AFTER INSERT OR UPDATE OR DELETE 
    ON a 
    FOR EACH ROW 
    EXECUTE PROCEDURE dosomething(); 

和:

CREATE OR REPLACE FUNCTION dosomething() 
    RETURNS trigger AS 
$BODY$ 

begin 
     code + calculation of result... 
       for row in 
          QUERY 
       Loop 
      Update a set calValue=result where id=... 
       end loop; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

意志adosomething()更新將導致觸發x的另一個調用?如果確實有辦法處理它,所以它不會卡在無限循環中?

我的目標是做dosomething()每次更新/插入/刪除動作a。由於觸發器中的更新a,我不想再次調用dosomething()

編輯:由於我在扳機正在更新不同勢專欄中,我能做到這一點:

CREATE TRIGGER x 
    BEFORE UPDATE OF value ON a 
    FOR EACH ROW 
    EXECUTE PROCEDURE dosomething(); 

這應該解決我的問題作爲觸發更新calcValue和跳跳虎未設置調用上value列。不過,我仍然想知道是否有我的原始問題的答案...假設觸發器將更新同一列。

+0

您也可以在觸發器上使用'when'子句。例如,以'when new.value <> old.value'的形式。 – Shoe

+0

你能解釋一下如何提供幫助?我沒有看到它的好處 – user2641077

+0

它只會在'value'字段發生變化時才執行觸發器。因此,在觸發器內更新'calcValue'時,觸發器不會再次被調用,從而阻止無限的「循環」。 – Shoe

回答

1

另一種方法是增加一個when條款,沿着線:

CREATE TRIGGER x 
AFTER INSERT OR UPDATE OR DELETE 
ON a 
FOR EACH ROW 
WHEN NEW IS NULL OR OLD IS NULL OR NEW.value <> OLD.value 
EXECUTE PROCEDURE dosomething(); 

時,有在值字段改變它只會執行觸發器。因此,當觸發器內部更新calcValue時,觸發器不會再次被調用,從而阻止無限的「循環」。

+0

這將如何工作?如果我正確地理解,在沒有任何變化的情況下,仍然會進行非食品電話呼叫。 – user2641077

+0

@ user2641077什麼不必要的電話? – Shoe

+0

ho我沒看到你寫了WHEN的'value'。 – user2641077