web-dev-qa-db-ja.com

OracleでONCOMMITのトリガーを定義するにはどうすればよいですか?

指定されたテーブルが変更された場合に、COMMIT(および例外をスローする場合はROLLBACK)の前に同期的に起動されるトリガーを定義する方法はOracleデータベースにありますか?

21

OracleにはONCOMMITトリガーメカニズムはありません。ただし、回避策があります。

  1. ON COMMIT REFRESHでマテリアライズド・ビューを使用して、このMVにトリガーを追加できます。これにより、ベーステーブルが変更されたときにロジックをトリガーできますコミット時。トリガーでエラーが発生した場合、トランザクションはロールバックされます(コミットされていない変更はすべて失われます)。

  2. DBMS_JOBを使用して、コミット後のアクションを延期できます。これは非同期アクションであり、場合によっては望ましい場合があります(たとえば、トランザクションが成功した後に電子メールを送信する場合)。プライマリトランザクションをロールバックすると、ジョブはキャンセルされます。ジョブとプライマリセッションは独立しています。ジョブが失敗した場合、メイントランザクションはロールバックされません。

あなたの場合、おそらくオプション(1)を使用できます。個人的には、トリガーにビジネスロジックをコーディングするのは、非常に複雑になるため好きではありませんが、技術的には実行可能だと思います。

33
Vincent Malgrat

同様の問題が発生しましたが、残念ながらオプション1は私の場合には便利ではありませんでした。

「AskTom」でも提案されている別の可能な解決策は、ストアドプロシージャを指定し、COMMITを実行する前にそのプロシージャを呼び出すことです。このソリューションは、COMMITを実行するコードにアクセスできる場合にのみ便利ですが、私の場合はこれが最も簡単なソリューションでした。

1
David Gausmann