1. ホーム
  2. sql

[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。

2022-03-11 08:08:47

質問

私は、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' は無効で、再バリデーションに失敗しました。 (0行に影響)

何が原因でこのエラーが発生するのか理解できません。このエラーの原因は何なのかご存知ですか?または、なぜこのようなことが起こるのでしょうか?

よろしくお願いします。

-デービッド

解決方法は?

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 しかし、おそらくあなたはトリガーでもっと面白いことをするつもりでしょう。