トリガ関数内でSQLコマンドを実行し、このコマンドがトリガの元となったテーブルにアクセスする場合、データの可視性規則に注意する必要があります。 この規則が、SQLコマンドがトリガの発行原因となったデータ変更を見ることができるかどうかを決定するからです。 簡単に以下に示します。
文レベルトリガは次に示す簡単な可視性規則に従います。
文によってなされた変更は、文の前に呼び出される文レベルトリガでは不可視です。
一方、文レベルのAFTER
トリガでは全ての変更が可視です。
当然ながら行レベルのBEFORE
トリガ内のSQLコマンドでは、トリガの発生原因となったデータ変更(挿入、更新、削除)はまだ発生していませんので、可視ではありません。
しかし、行レベルのBEFORE
トリガで実行されるSQLコマンドは、その外側のコマンドで以前に処理された行へのデータ変更の影響を見ることになるでしょう。
これらの変更イベントの順序は一般的に予測できませんので、注意が必要です。
複数行に影響するSQLコマンドはどのような順番でもその行を更新することができます。
同様に、行レベルのINSTEAD OF
トリガは、同じ外側のコマンドで以前に処理されたINSTEAD OF
トリガよる変更結果を見ることになるでしょう。
行レベルのAFTER
トリガが発生すると、その外側のコマンドによってなされた全ての変更は既に完了していますので、呼び出されたトリガ関数から可視になります。
もし、あなたのトリガが標準的な手続き型言語のいずれかで記述されている時、上記の可視性は関数がVOLATILE
で定義されている場合のみ適用されます。
STABLE
、もしくはIMMUTABLE
で定義されている関数は、どのようなケースにおいても、呼び出しコマンドによる変更は見ないでしょう。
データ可視性規則に関する詳細は44.4. データ変更の可視性にあります。 36.4. 完全なトリガの例の例にこの規則を示します。