1

私はpgtapを使用して、次の方法でいくつかの遅延制約トリガーをテストしています。

  • トランザクションを開く
  • いくつかのテストデータを挿入する
  • いくつかのステートメントを実行する
  • を使用してコミットをシミュレートするSET CONSTRAINTS ALL IMMEDIATE
  • コミット後の条件のテスト

これは正常に機能しますが、トランザクションごとに1つのテストに制限されます。後でさらにデータを設定しようとすると、以前に延期されていた制約がすぐに実行されるようになりました。

SET CONSTRAINTS ALL IMMEDIATEをアクティブにした制約の効果を元に戻さずに、の効果を元に戻すことは可能ですか?そうでない場合、私の唯一のオプションは、各テストを別々のファイルに移動することです。これは少し面倒です。

4

1 に答える 1

2

やってみました

SET CONSTRAINTS ALL DEFERRED

電話した後SET CONSTRAINTS ALL IMMEDIATE

それが必要以上の制約を延期する場合は、それらに個別に名前を付ける必要があります。

SET CONSTRAINTS my_constraint [, ...] DEFERRED;

効果は元に戻りません。それはそれ以上のチェックを延期するだけです。制約に違反すると、EXCEPTIONが発生します。ここで元に戻すことができるものは何もありません。

必要に応じて、plpgsql関数で例外をキャッチできます。

制約を初期状態に戻したい場合は、SET個別に明示的な状態で制約を戻す必要があります。残念ながら、私の知る限り、PostgreSQL9.1にはすべてを初期状態にする「RESETCONSTRAINTS」はありません。

マニュアルページ。

于 2012-08-03T17:00:54.423 に答える