1

挿入/更新された情報をチェックし、それらをデータベースのデータと比較し、正しくない場合は操作全体を停止するトリガーを作成します。トリガーの前に(それぞれに対して)書き込み、何か問題がある場合はアプリケーション例外をスローしましたが、更新されたテーブルから読み取ったため、機能していなかったため、ORA-04091エラーが発生しました。

そして今、私はこれを解決する方法を考えていますか?今、私の唯一のアイデアは、必要なデータをパッケージに挿入する前トリガーを作成し、それぞれではない後トリガーでそれらを読み取ることです。しかし、この版を中止する方法に問題がありますか? ロールバックを行うと、このトランザクションのすべての操作が取り消され、賢明ではないと思います。この問題をどのように解決しますか?

4

1 に答える 1

3

そこに行かないでください。

ORA-04091: table XXXX is mutatingこれは一般的に、実行しようとしているものが複雑すぎて、トリガーを使用して確実に実行できないことを示す良い指標です。

確かに、パッケージ配列変数といくつかのトリガーを使用して (うーん!)、このエラーを回避できますが、コードは次のようになる可能性が高くなります。

  • その複雑さとトリガーの予測不可能な性質のために維持できない
  • マルチユーザー環境にうまく反応しない

これが、このエラーが発生したときにアプローチを再考する必要がある理由です。行間の一貫性に対処するために、パッケージに適切にグループ化された一連のプロシージャを作成することをお勧めします。テーブルを直接 DML するすべての権限を取り消し、それらの手順のみを使用してテーブルを変更します。

たとえば、更新手順は次のようなアトミックプロセスになります。

  1. 同じ行グループでの同時更新を防ぐためにロックを取得します (たとえば、ホテル予約アプリケーションで部屋のレコードをロックします)。
  2. 挿入される行がすべてのビジネス ロジックを検証することを確認する
  3. 関連するすべての DML を作成する
  4. エラーが発生した場合は、すべての変更 (トランザクション全体ではなく変更のみ) をロールバックします (PL/SQL を使用すると簡単です。エラーを発生させるだけです)。
于 2013-03-01T15:39:45.167 に答える