31

perという名前のテーブルがあります。テーブルごとに、「fl1」という名前のフィールドと「fl2」という名前の別のフィールドがあります。レコードを更新するときに、「fl1」の値が変更されたかどうかを確認したい". 値が変更されている場合は、「fl1」の新しい値で「fl2」列を更新します。

このトリガーを思いついた

CREATE OR REPLACE TRIGGER Flag
AFTER INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
BEGIN
  If :New.fl1 != :Old.fl1 Then
        :New.fl2:= :new.fl1;
  End If;
END;

実行すると、「ORA-04082: NEW または OLD 参照はテーブル レベル トリガーでは許可されていません」というメッセージが表示されます。

私が考えていたもう1つのオプション(効率的かどうかはわかりません)は、「fl1」の値が変更されたかどうかに関係なく、「fl2」の値を「fl1」の値で単純に更新することです。

アップデート

「For Each Row」を追加し、「BEFORE INSERT OR UPDATE」を「AFTER INSERT OR UPDATE」に変更しました。それは働いています。

CREATE OR REPLACE TRIGGER Flag
BEFORE INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW
BEGIN
If :New.fl1 != :Old.fl1 Then
   :New.fl2:= :new.fl1;
End If;
END;
4

2 に答える 2

7

最終的な作業コード:

CREATE OR REPLACE TRIGGER Flag
BEFORE INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW
BEGIN
If :New.fl1 != :Old.fl1 Then
   :New.fl2:= :new.fl1;
End If;
END;
于 2013-09-11T17:54:03.183 に答える