雖然許多觸發程序的使用涉及使用者編寫的觸發函數,但 PostgreSQL 提供了一些內建觸發函數,可以直接在使用者定義的觸發程序中使用。這些函數總結在表 9.107中。(還有其他內建的觸發函數,用於實作外鍵約束和延遲索引約束。由於使用者無需直接使用它們,因此這裡不再介紹。)
有關建立觸發程序的更多資訊,請參閱CREATE TRIGGER。
表 9.107. 內建觸發函數
函數 描述 使用範例 |
---|
抑制無效的更新操作。詳情請見下文。
|
自動從相關的純文字文件欄位更新
|
自動從相關的純文字文件欄位更新
|
當作為列級別 BEFORE UPDATE
觸發程序應用時,suppress_redundant_updates_trigger
函數將阻止任何實際上沒有更改列中資料的更新發生。 這會覆蓋始終執行實體列更新的正常行為,無論資料是否已更改。(這種正常行為使更新執行得更快,因為不需要檢查,並且在某些情況下也很有用。)
理想情況下,您應該避免執行實際上沒有更改記錄中資料的更新。 多餘的更新可能會花費大量不必要的時間,尤其是在有很多索引要更改的情況下,以及最終必須清除死列中的空間。 但是,在客戶端程式碼中檢測這種情況並不總是那麼容易,甚至不可能,並且編寫表達式來檢測它們可能會容易出錯。 一種替代方法是使用 suppress_redundant_updates_trigger
,它將跳過未更改資料的更新。 但是,您應該小心使用它。 每次記錄時,觸發程序都會花費少量但重要的時間,因此,如果受更新影響的大多數記錄確實發生了更改,則使用此觸發程序將使更新的平均運行速度變慢。
可以像這樣將 suppress_redundant_updates_trigger
函數添加到資料表中
CREATE TRIGGER z_min_update BEFORE UPDATE ON tablename FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();
在大多數情況下,您需要為每列最後觸發此觸發程序,以便它不會覆蓋可能希望更改列的其他觸發程序。 請記住,觸發程序按名稱順序觸發,因此,您將選擇一個觸發程序名稱,該名稱在您可能在資料表上擁有的任何其他觸發程序的名稱之後。(因此,範例中帶有「z」前綴。)
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步說明的地方,請使用此表單來回報文件問題。