私は、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: trigger 'JMD.NEWALERT' is invalid and failed re-validation (該当する行は0行)
何が原因でこのエラーが発生するのか理解できません。このエラーの原因は何なのかご存知ですか?または、なぜこのようなことが起こっているのでしょうか?
よろしくお願いします。
-デービッド
Oracle は、参照された無効なオブジェクトを再コンパイルしようとします。ここでは、トリガが無効であり、行を挿入しようとするたびに、トリガを再コンパイルしようとして失敗し、ORA-04098エラーにつながります。
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;
/
もし、コンパイル時の警告が表示された場合は、SQL*Plus や SQL Developer で show errors
を実行するか、再度 user_errors
をクエリで実行してください。
もちろん、これは Users
テーブルにこれらのカラム名があり、それらがすべて varchar2
であることを仮定しています... しかし、おそらくあなたはトリガーでもっと面白いことをすることになるでしょう。
原因トリガーを実行するために取得しようとしましたが、無効であることが判明しました。これは、トリガーのコンパイル/オーソライズに失敗したことも意味します。
対処法コンパイル/認証エラーを解決する、トリガーを無効にする、またはトリガーを削除する、などのオプションがあります。
構文
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;