Я пытаюсь создать простой триггер в базе данных 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.
Вы можете 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 ;