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 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

37.2. 資料更改的可視性 #

如果在觸發器函式中執行 SQL 命令,並且這些命令訪問觸發器所屬的表,那麼您需要注意資料可視性規則,因為它們決定了這些 SQL 命令是否會看到觸發器觸發的資料更改。簡而言之:

  • 語句級觸發器遵循簡單的可見性規則:語句所做的任何更改都對語句級的 BEFORE 觸發器不可見,而所有修改對語句級的 AFTER 觸發器都是可見的。

  • 導致觸發器觸發的資料更改(插入、更新或刪除)自然對行級 BEFORE 觸發器中執行的 SQL 命令是 不可見 的,因為它們尚未發生。

  • 然而,行級 BEFORE 觸發器中執行的 SQL 命令 看到同一外部命令中先前處理過的行的對資料更改的影響。這需要謹慎,因為這些更改事件的順序通常是不可預測的;影響多行的 SQL 命令可以按任何順序訪問這些行。

  • 同樣,行級 INSTEAD OF 觸發器將看到同一外部命令中先前觸發 INSTEAD OF 觸發器的影響。

  • 當行級 AFTER 觸發器被觸發時,外部命令所做的所有資料更改都已完成,並且對呼叫的觸發器函式是可見的。

如果您的觸發器函式是用任何標準過程語言編寫的,那麼上述陳述僅在函式宣告為 VOLATILE 時適用。宣告為 STABLEIMMUTABLE 的函式在任何情況下都不會看到呼叫命令所做的更改。

有關資料可見性規則的更多資訊,請參閱 第 45.5 節第 37.4 節 中的示例包含對此類規則的演示。

提交更正

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