私はtableAに挿入するときにトリガされる関数を設定しています。これは最初にtableBでエントリを作成し、次に外部キーが存在するtableC内にいくつかのエントリを作成しますtableBに関連しています。しかし、関数が実行を終了しない限り、tableBに存在しない外部キーフィールドの値をtableCに挿入しようとするため、エラーが発生します。関数のシーケンス結果PostgreSQL 9.5
関数内に、関数内に何らかの戻りを入れますが、関数を終了せずに残りの部分を実行する方法はありますか?次のようになり何か:
CREATE OR REPLACE FUNCTION trigger1() RETURNS trigger AS
$BODY$
begin
insert into tableB values (new.value);
RETURN NEW;
insert into tableC (id, fkey) values (new.something, new.value);
RETURN NEW;
end;
$BODY$
LANGUAGE plpgsql;
私は、彼らは両方の前に実行されているかもしれないので、成功せず、実行を注文するアルファベット順を使用して、2つの異なるトリガに機能を分離することを試みた...
ご存じですか?
おかげ
感謝。私はこの問題の仕組みを理解するのが難しいです。外部キーを延期し、拘束力が尊重されていない場合はどうなりますか?それはエラーを起こすでしょうか?トランザクションの終了時に、トランザクション全体を「覚えて」キャンセルします。 –
はい、制約の失敗時にエラーが発生し、トランザクションがロールバックされます。ただし、Expliciteトランザクションを使用する必要はありません。外部トランザクションがない場合、トリガー関数は単一のトランザクションそのものです。一般的には、トリガーで何かを変更することなく、期待どおりに動作します。 – klin