Intereting Posts
Ключевое слово Oracle «Partition By» Создать представление, основанное на иерархии / используемом CTE Странное дублирующее поведение из GROUP_CONCAT двух LEFT JOINs из GROUP_BYs Удаление с использованием нескольких таблиц и повторная таблица в подзапросе Android Sqlite: проверьте, существует ли строка в таблице. Динамический стержень в оракуле sql Доступ / реактивный эквивалент декодирования Oracle # 1366 – Неправильное целочисленное значение: MYsql Вычислить разницу между значением в разных строках и столбцах Как конвертировать Date-time в Date с помощью Netezza Оптимизировать запрос самостоятельного соединения MySQL Несколько кумулятивных сумм Каков наилучший способ представления отношения «многие ко многим» между записями в одной таблице SQL? Найти фильмы с наибольшим количеством наград в течение определенного года – дублирование кода Как я могу получать данные синхронно из cordova-sqlite?

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

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

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

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

Синтаксис

 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 ;