支援版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

9.29. 觸發函數 #

雖然許多觸發程序的使用涉及使用者編寫的觸發函數,但 PostgreSQL 提供了一些內建觸發函數,可以直接在使用者定義的觸發程序中使用。這些函數總結在表 9.107中。(還有其他內建的觸發函數,用於實作外鍵約束和延遲索引約束。由於使用者無需直接使用它們,因此這裡不再介紹。)

有關建立觸發程序的更多資訊,請參閱CREATE TRIGGER

表 9.107. 內建觸發函數

函數

描述

使用範例

suppress_redundant_updates_trigger ( ) → trigger

抑制無效的更新操作。詳情請見下文。

CREATE TRIGGER ... suppress_redundant_updates_trigger()

tsvector_update_trigger ( ) → trigger

自動從相關的純文字文件欄位更新 tsvector 欄位。要使用的文字搜尋配置由名稱指定為觸發程序參數。 有關詳細資訊,請參閱第 12.4.3 節

CREATE TRIGGER ... tsvector_update_trigger(tsvcol, 'pg_catalog.swedish', title, body)

tsvector_update_trigger_column ( ) → trigger

自動從相關的純文字文件欄位更新 tsvector 欄位。要使用的文字搜尋配置取自資料表的 regconfig 欄位。 有關詳細資訊,請參閱第 12.4.3 節

CREATE TRIGGER ... tsvector_update_trigger_column(tsvcol, tsconfigcol, title, body)


當作為列級別 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前綴。)

提交更正

如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步說明的地方,請使用此表單來回報文件問題。