2016-10-21 104 views
2

我有一個trigger_function_a在插入或更新field_1或field_2之前觸發。我有一個插入或field_3或field_4更新之前觸發另一trigger_function_b:觸發器功能是否應該觸發另一個觸發器?

插入或field_3或field_4 =>更新之前trigger_function_a

field_1或field_2 =>的插入或更新之前trigger_function_b

現在,trigger_function_a修改field_3。 trigger_function_b是否應該被觸發?我試過了,但沒有觸發。爲什麼?我搜索了所有可用的文檔,但我還沒有找到答案。

請不要在意這裏的語法。如果我自己修改這些字段,觸發器函數可以爲他們自己工作, G。通過SQL。我在這裏問的是:如果另一個觸發器函數修改其字段,觸發器函數是否應該被觸發?

+0

這可能是有趣的:http://dba.stackexchange.com/questions/103402/how-to-prevent-a-postgresql-trigger-from-being-fired-by-another-trigger – verhie

+0

@verhie:謝謝。將有一個看看。順便說一句,這是postgresql 9.5 –

回答

0

你是對的,trigger_function_b在這種情況下不會被調用。

the documentation:當任一列在UPDATE命令的列表SET被列爲目標

特定列觸發(一個使用UPDATE OF column_name語法定義)將閃光。即使未觸發觸發器,也可以更改列的值,因爲不會考慮對行內容觸發器所做的更改,因此不會觸發BEFORE UPDATE觸發器。相反,如UPDATE ... SET x = x ...這樣的命令將在列x上觸發一個觸發器,即使列的值沒有改變。

這裏的關鍵是觸發器觸發當且僅當列出現在SET列表中。

+0

所以,不過,這*是語法問題。我用NEW.field_3 = ...語法。似乎我不得不更新東西... –

+0

它說「*在'UPDATE'命令的'SET'列表*」中列爲目標。如果你在一個函數中分配了'NEW.field_3',那是不同的。 –