Oracle 10gデータベースで単純なトリガーを作成しようとしています。トリガーを作成するこのスクリプトはクリーンに実行されます。
CREATE OR REPLACE TRIGGER newAlert
AFTER INSERT OR UPDATE ON Alerts
BEGIN
INSERT INTO Users (userID, firstName, lastName, password) VALUES ('how', 'im', 'testing', 'this trigger')
END;
/
しかし、実行すると:
INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);
トリガーをアクティブにするには、次のエラーメッセージが表示されます。
ORA-04098:トリガー 'JMD.NEWALERT'は無効であり、再検証に失敗しました(影響を受ける行はありません)
このエラーの原因はわかりません。このエラーの原因を知っていますか?またはなぜこれが起こっているのですか?
前もって感謝します!
-デビッド
Oracleは、参照されている無効なオブジェクトを再コンパイルしようとします。ここで、トリガーは無効です。行を挿入しようとするたびに、トリガーの再コンパイルが試行され、失敗し、ORA-04098エラーが発生します。
あなたはできる select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'
トリガーが実際に取得するエラーと、コンパイルされない理由を確認します。この場合、insert
行の最後にセミコロンが欠落しているように見えます。
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')
だからそれを作る:
CREATE OR REPLACE TRIGGER newAlert
AFTER INSERT OR UPDATE ON Alerts
BEGIN
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger');
END;
/
コンパイル時に警告が表示された場合、show errors
SQL * PlusまたはSQL Developerを使用している場合、またはuser_errors
もう一度。
もちろん、これはUsers
テーブルにこれらの列名があり、それらがすべてvarchar2
...しかし、おそらくトリガーを使ってもっと面白いことをするでしょう。
原因:トリガーを実行のために取得しようとしましたが、無効であることがわかりました。これは、トリガーのコンパイル/許可が失敗したことも意味します。
処置:オプションは、コンパイル/認可エラーの解決、トリガーの無効化、またはトリガーのドロップです。
構文
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;
私の場合、このエラーはシーケンスが作成されなかったために発生します。
CREATE SEQUENCE J.SOME_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ;