1

テーブルからのレコードの削除時に起動し、別のテーブルにレコードを挿入して、削除されたレコードの詳細を使用するトリガーを作成したいと思います。

データベース:Oracle 10g

私のトリガーはこのように見えました

CREATE or REPLACE TRIGGER myTrigger
AFTER DELETE
    ON myTable
    REFERENCING NEW AS old_tab
    FOR EACH ROW
BEGIN
    INSERT INTO ACTIVITYLOG values ('ADMIN',:old_tab.tabletID,'MIGRATION','ERROR','TEST','T','NIL',sysdate)
END;

ここ:old_tab.tabletIDに、削除が行われるtabletIDテーブルの列があります。myTable削除したIとログを保存したい。

しかし、レコードを削除しようとすると、次のエラーが発生します

エラーコード4098、SQL状態42000:ORA-04098:トリガー'DB.MYTRIGGER'が無効であり、再検証に失敗しました

PS NetBeansSQLEditorでトリガーの作成を実行しました。

これが、

編集

STRUCTURE OF myTable (テーブル削除が発生します)

tabletID varchar2(15) PRIMARY KEY
tabletName varchar2(100)

の構造 ACTIVITYLOG

username varchar2(15)
tabletKey varchar2(15)
page_ref varchar2(100)
errors varchar2(100)
remarks varchar2(100)
operationcode char(2)
lastupdateip varchar2(20)
lastupdatedate date

申し訳ありませんが、SQLPLUSEDITORにアクセスできません。

4

2 に答える 2

2

:NEW値ではなく:OLD値を使用する必要があります。DELETEトリガーの:NEW値(BEFOREまたはAFTER)は空白です。あなたがそれについて考えるならば、レコードはこの時点で論理的に存在しなくなったので、これは理にかなっています。

ただし、これはコンパイルエラーの原因ではありません。

「削除しても同じエラーが表示されます。」

何が悪いのかを推測して一日中過ごすことができると思うので、ここでやめましょう。この単純なクエリでコンパイルエラーを発見できます。

select * from user_errors
where name = 'MYTRIGGER'
and type = 'TRIGGER'

「:NEWを:OLDに変更し、セミコロンを追加してSQL PLUSで実行したところ、うまくいきました」

将来のために、ここにコンパイルされ、必要な値を正しく書き込むトリガーのバージョンがあります。

CREATE or REPLACE TRIGGER myTrigger 
AFTER DELETE 
    ON myTable 
    REFERENCING OLD AS old_tab 
    FOR EACH ROW 
BEGIN 
    INSERT INTO ACTIVITYLOG values ('ADMIN',:old_tab.tabletID,'MIGRATION','ERROR','TEST','T','NIL',sysdate); 
END; 
/
于 2012-07-24T08:01:37.370 に答える
0

問題はこれです:

REFERENCING NEW AS old_tab

「old_tab」というラベルで新しい値を再定義しました。#define FALSE TRUEこれは、プログラムの先頭に追加するようなものです。

semicolon挿入ステートメントの後にを追加します

AFTER DELETEトリガーを使用しているため、:OLD値にアクセスするだけで済みます(例:

CREATE or REPLACE TRIGGER myTrigger
AFTER DELETE
    ON myTable
    FOR EACH ROW
BEGIN
    INSERT INTO ACTIVITYLOG values ('ADMIN',:OLD.tabletID,'MIGRATION','ERROR','TEST','T','NIL',sysdate);
END;
于 2012-07-24T08:21:57.230 に答える