Postgres でのデータ変更時の可視規則は 以下の通りです。問い合わせ実行中、その問い合わせ自身によって ( SQL 関数、SPI 関数、トリガ経由で)なされたデータの変更は、 その問い合わせのスキャンに対して不可視となります。例えば、
INSERT INTO a SELECT * FROM a;という問い合わせでは、挿入されたタプルは、SELECT スキャンに対して 不可視となります。このため、この問い合わせはデータベースの テーブルを 再帰処理することなく(もちろん、一意性インデックス規則に従って) 二重化します。
しかし、SPI 文書中の可視性に関する次の注意書きを覚えておいて下さい。
問い合わせ Q によりなされる変更は、問い合わせ Q の後に開始した問 い合わせに対しては可視です。この問い合わせが Q の内側で( Q の実 行中に)開始されたのか、Q の実行が終ってから開始されたのかについ ては問いません。
当然のことですが、挿入されるタプル( tg_trigtuple )は BEFORE トリガ中の 問い合わせに対しては不可視となります。AFTER トリガ中の問い合わせに 対してはこの(挿入されたばかりの)タプルは可視に、そして、 その後の BEFORE/AFTER トリガー中の問い合わせでは可視になります!