2012年5月12日 星期六

Postgresql Trigger 筆記


行觸發器 - before
=>在某行操作前觸發
=>回傳值可以為NULL(忽略對當前行的操作)
=>當在『Insert』和『Update』時,返回的『數據行(類型為HeapTuple的數值)』將成為被插入的行或者是成為將要更新的行.
=>當不想更改Insert或Update語句的內容時,在觸發器函數中就要回傳原本要被Insert或Update的數據行,Insert時為『NEW物件』,Update時為『OLD物件』
=>多用於
  1.檢查或修改將要插入或者更新的數據.(例如當目前時間插入一個時間戳字段)
  2.跟踪該行的兩個元素是一致的.
=>效率比『行觸發器 - after』高
=>其中的SQL命令不能看見行數據改變(插入,更新,刪除)的結果資料.
=>其中的SQL命令會看見在同一個外層命令前面處理的行做的數據改變.

行觸發器 - after
=>在行處理完畢後觸發(在語句級別的after觸發器前觸發)
=>返回值沒有意義,所以會被乎略,可以返回NULL
=>多用於
  1.填充或者更新其它表
  2.對其它表進行一致性檢查.
=>其中的SQL命令會看見行數據改變(插入,更新,刪除)的結果資料

語句觸發器 - before
=>開始做任何事情前觸發
=>回傳值只能是NULL
=>看不到整個語句做的插入或修改的結果.

語句觸發器 - after
=>語句最後觸發
=>回傳值只能是NULL
=>可看見整個語句做的插入或修改的結果.

*如果多於一個觸發器被定義在同樣的事件(Insert,Update,Delete)上,
 觸發器將按照由名字的字母順序排序的順序觸發,如果是『before型』
 的觸發器,每個觸發器返回的資料行將成為下一個觸發器的輸入,如果
 任何『before型』觸發器返回NULL,那其操作會被放棄且隨後的觸發器
 不會被觸發.

*定義一個觸發器,可以聲明參數,目的是允許類似需求的不同觸發器調用同一個函數.