2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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.110 中。(還存在其他內建觸發器函式,它們實現了外部索引鍵約束和延遲索引約束。這些不在此處文件化,因為使用者不需要直接使用它們。)

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

表 9.110. 內建觸發器函式

函式

描述

用法示例

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)


suppress_redundant_updates_trigger 函式,當作為行級 BEFORE UPDATE 觸發器應用時,將阻止任何實際上未更改行中資料的更新的發生。這會覆蓋正常行為,即正常行為始終執行物理行更新,而不管資料是否已更改。(這種正常行為使更新執行更快,因為不需要檢查,並且在某些情況下也很有用。)

理想情況下,您應該避免執行實際上並未更改記錄中資料的更新。冗餘更新可能耗費大量不必要的時間,特別是當有大量索引需要更改時,並且會產生死行空間,最終需要進行清理。但是,在客戶端程式碼中檢測這種情況並不總是容易,甚至不可能,並且編寫表示式來檢測它們可能容易出錯。另一種方法是使用 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 字首。)

提交更正

如果您在文件中發現任何不正確的內容、與您對特定功能的經驗不符的內容或需要進一步澄清的內容,請使用 此表格 報告文件問題。