更新を行う前にトリガーからトリガーを無効にしてから、それを再利用できるようにする必要がある状況に遭遇しました。
基本的に、2つのテーブルがあります。
TIME_SLOTS
プログラムのタイムスロットを設定するための開始時刻、終了時刻、およびどのプログラムを指定するためのプログラムID(外部キー)などのフィールドがあります。PROGRAMMES
利用可能なすべての異なるプログラムとその詳細のリストが含まれています。期間も含まれます。
に更新または挿入するときTIME_SLOTS
に、トリガーが期間をルックアップし、PROGRAMMES
終了時間=開始時間+期間であることを確認する既存のトリガーがあります。
TIME_SLOTS
また、の期間を変更するときに終了時刻を更新する新しいトリガーを追加したいと思いますPROGRAMMES
。
これらの2つのトリガーを設定しましたが、期間を変更すると、次のようになります。
One error saving changes to table "SE217"."PROGRAMMES":
Row 1: ORA-04091: table SE217.PROGRAMMES is mutating, trigger/function may not see it
ORA-06512: at "SE217.SCHEDULES_VALID_TIMES", line 19
ORA-04088: error during execution of trigger 'SE217.SCHEDULES_VALID_TIMES'
ORA-06512: at "SE217.UPDATE_END_TIME", line 5
ORA-04088: error during execution of trigger 'SE217.UPDATE_END_TIME'
これは明らかに、期間を変更すると、2番目のトリガーがで終了時刻を更新するためTIME_SLOTS
です。トリガーが起動TIME_SLOTS
し、期間を検索します-期間が変化しているため、上記のエラーが発生します。
新しく計算された終了時刻で行を更新するときはTIME_SLOTS
、更新前にトリガーを無効にし、更新後に再利用可能にする必要があるようですが、これはトリガーであるため、トリガーを変更することはできません...
何か案は?
編集:グローバル変数を設定して、実行したくないトリガーでこの変数をチェックできると思っていましたが、実装するのに最適な方法がわかりませんでしたか?