如果在觸發器函式中執行 SQL 命令,並且這些命令訪問觸發器所屬的表,那麼您需要注意資料可視性規則,因為它們決定了這些 SQL 命令是否會看到觸發器觸發的資料更改。簡而言之:
語句級觸發器遵循簡單的可見性規則:語句所做的任何更改都對語句級的 BEFORE
觸發器不可見,而所有修改對語句級的 AFTER
觸發器都是可見的。
導致觸發器觸發的資料更改(插入、更新或刪除)自然對行級 BEFORE
觸發器中執行的 SQL 命令是 不可見 的,因為它們尚未發生。
然而,行級 BEFORE
觸發器中執行的 SQL 命令 將 看到同一外部命令中先前處理過的行的對資料更改的影響。這需要謹慎,因為這些更改事件的順序通常是不可預測的;影響多行的 SQL 命令可以按任何順序訪問這些行。
同樣,行級 INSTEAD OF
觸發器將看到同一外部命令中先前觸發 INSTEAD OF
觸發器的影響。
當行級 AFTER
觸發器被觸發時,外部命令所做的所有資料更改都已完成,並且對呼叫的觸發器函式是可見的。
如果您的觸發器函式是用任何標準過程語言編寫的,那麼上述陳述僅在函式宣告為 VOLATILE
時適用。宣告為 STABLE
或 IMMUTABLE
的函式在任何情況下都不會看到呼叫命令所做的更改。
如果您在文件中看到任何不正確、不符合您對特定功能的實際經驗或需要進一步澄清的內容,請使用 此表格 報告文件問題。