2017-04-22 4 views
0

複合トリガーに次の簡単なトリガーを設定すると、ORA-04091 table is mutating errorが回避されます。トリガーを複合トリガーにする?

CREATE OR REPLACE TRIGGER grades_before_update 
BEFORE UPDATE OF grade_percent 
ON grades 
FOR EACH ROW 
DECLARE 
    grade_percent_var NUMBER; 
BEGIN 
    SELECT grade_percent 
    INTO grade_percent_var 
    FROM grades 
    WHERE student_id = :new.student_id;  

    IF (grade_percent_var > 100 OR grade_percent_var < 0) THEN 
      RAISE_APPLICATION_ERROR(-20001, 'grade percent must be between 0 and 100'); 
    END IF; 
END; 
/

私のようなUPDATEクエリ使用してこのトリガーをテストするたびので、私は求めている理由は次のとおりです。

UPDATE grades 
SET grade_percent = 90 
WHERE student_id = 1; 

私はORA-04091 table is mutating errorを取得します。私はそれを検索したと、このサイトは、私はこのエラーを回避する複合トリガーを必要とするだろうと述べている:

Using Triggers

しかし、私が開始するのか分かりません。

+0

更新前にフィールド「grade_percent」の値をチェックすることはあなたの目標ですか? –

+0

はい。トリガーを使用する必要があります。それは要件の一部です。 – 5120bee

答えて

2

現在の値を確認するだけで複合トリガは必要ありません。このエラーは、更新しているテーブルを選択しているため、これは無効な操作(beforeトリガー)です。いずれの変数も、SELECT文を宣言する必要が

IF (:NEW.grade_percent > 100 OR :NEW.grade_percent < 0) THEN 
     RAISE_APPLICATION_ERROR(-20001, 'grade percent must be between 0 and 100'); 
END IF; 

ありません:

だから、あなたはそれのようになりますが:new.student_id

でやったのと同じ方法そのフィールドの値にアクセスする必要があります。 :NEW.grade_percentは、updateコマンドで使用された値です。

関連する問題