データ変更の可視性

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 36章トリガ | 早送り | 次のページ

# 36.2. データ変更の可視性

トリガ関数内でSQLコマンドを実行し、このコマンドがトリガの元となったテーブルにアクセスする場合、データの可視性規則に注意する必要があります。 この規則が、SQLコマンドがトリガの発行原因となったデータ変更を見ることができるかどうかを決定するからです。 簡単に以下に示します。

- 文レベルトリガは次に示す簡単な可視性規則に従います。 文によってなされた変更は、文の前に呼び出される文レベルトリガでは不可視です。 一方、文レベルの`AFTER`トリガでは全ての変更が可視です。

- 当然ながら行レベルの`BEFORE`トリガ内のSQLコマンドでは、トリガの発生原因となったデータ変更（挿入、更新、削除）はまだ発生していませんので、可視ではありません。

- しかし、行レベルの`BEFORE`トリガで実行されるSQLコマンドは、その外側のコマンドで以前に処理された行へのデータ変更の影響を見ることになるでしょう。 これらの変更イベントの順序は一般的に予測できませんので、注意が必要です。 複数行に影響するSQLコマンドはどのような順番でもその行を更新することができます。

- 同様に、行レベルの`INSTEAD OF`トリガは、同じ外側のコマンドで以前に処理された`INSTEAD OF`トリガよる変更結果を見ることになるでしょう。

- 行レベルの`AFTER`トリガが発生すると、その外側のコマンドによってなされた全ての変更は既に完了していますので、呼び出されたトリガ関数から可視になります。

もし、あなたのトリガが標準的な手続き型言語のいずれかで記述されている時、上記の可視性は関数が`VOLATILE`で定義されている場合のみ適用されます。 `STABLE`、もしくは`IMMUTABLE`で定義されている関数は、どのようなケースにおいても、呼び出しコマンドによる変更は見ないでしょう。

データ可視性規則に関する詳細は項43.4にあります。 項36.4の例にこの規則を示します。

前のページ | ホーム | 次のページ
トリガ動作の概要 | 上に戻る | Cによるトリガ関数の作成