web-dev-qa-db-ja.com

OracleトリガーORA-04098:トリガーが無効で、再検証に失敗しました

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'は無効であり、再検証に失敗しました(影響を受ける行はありません)

このエラーの原因はわかりません。このエラーの原因を知っていますか?またはなぜこれが起こっているのですか?

前もって感謝します!

-デビッド

21
user3412162

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...しかし、おそらくトリガーを使ってもっと面白いことをするでしょう。

36
Alex Poole

原因:トリガーを実行のために取得しようとしましたが、無効であることがわかりました。これは、トリガーのコンパイル/許可が失敗したことも意味します。

処置:オプションは、コンパイル/認可エラーの解決、トリガーの無効化、またはトリガーのドロップです。

構文

ALTER TRIGGER trigger Name DISABLE;

ALTER TRIGGER trigger_Name ENABLE;
3
Kiran.Bakwad

私の場合、このエラーはシーケンスが作成されなかったために発生します。

CREATE SEQUENCE  J.SOME_SEQ  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
0
Siva Anand