支援的版本:目前 (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 節中的範例包含這些規則的示範。

提交更正

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