Oracle Trigger ORA-04098: триггер недействителен и не прошел повторную проверку

Я пытаюсь создать простой триггер в базе данных oracle 10g. Этот script для создания запуска запускается чистым.

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 строк)

Я не понимаю, что вызывает эту ошибку. Вы знаете, что вызывает эту ошибку? Или почему это происходит?

Заранее благодарю вас!

-Давид

Ответ 1

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... но, предположительно, вы действительно будете делать что-то более интересное с помощью триггера.

Ответ 2

Причина. Триггер попытался получить на исполнение и был признан недействительным. Это также означает, что для триггера не удалось выполнить компиляцию/авторизацию.

Действие: параметры предназначены для устранения ошибок компиляции/авторизации, отключения триггера или удаления триггера.

Синтаксис

ALTER TRIGGER trigger Name DISABLE;

ALTER TRIGGER trigger_Name ENABLE;

Ответ 3

в моем случае эта ошибка возникает из-за того, что последовательность не была создана..

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