2016-10-29 2 views
0

表示されない場合がありエラートリガー:表に変異され、トリガは/関数は、それは私がこのトリガーを書いた

CREATE OR REPLACE TRIGGER update_expirationDate 
AFTER INSERT ON DIFFUSION FOR EACH ROW 
DECLARE 
    lastdiffusion DATE; 
BEGIN 
    SELECT MAX(diffusionDate) INTO lastdiffusion FROM DIFFUSION WHERE idEpisode = :NEW.idEpisode; 
    UPDATE EPISODE SET expirationDate = lastdiffusion + 14 WHERE idEpisode = :NEW.idEpisode; 
END; 
/

コンパイルはOKですが、私は、拡散にいくつかの値を挿入すると、私は次のようなエラーがあります。

ORA-04091: table DIFFUSION is mutating, trigger/function may not see it 

私は問題が何であるかを見ていない...は

誰かが私を助け、私が間違っているのを教えすることはできますか?ありがとう。

+0

私は数日前に同様の[質問](http://stackoverflow.com/questions/40314769/how-to-avoid-table-mutating-errors/40317580#40317580)に回答しました。 – 0xdb

答えて

1

問題は、トリガー自体で更新されているテーブルを参照していることです。オラクルは混乱します。そして、あなたはこれについて十分に考えていれば、おそらく混乱するでしょう。

幸いにも、この場合、私はあなたがテーブルを参照する必要はないと思います。代わりに、ちょうどupdateのロジックを使用します。

ある
CREATE OR REPLACE TRIGGER update_expirationDate 
AFTER INSERT ON DIFFUSION FOR EACH ROW 
BEGIN 
    UPDATE EPISODE 
     SET expirationDate = :NEW.diffusionDate + 14 
     WHERE idEpisode = :NEW.idEpisode AND 
       expirationDate < :NEW.diffusionDate + 14; 
END; 

、唯一expirationDate更新値を変更しようとしているとき。これを挿入ごとに行うと、常に最大値になります。

+0

ありがとうございます!それはまさに私がやっていることを三重にしていたものです – iAmoric

関連する問題