#sql #oracle
#sql #Oracle
Вопрос:
Я пытаюсь создать триггер для моей таблицы, который автоматически добавляет дату публикации в зависимости от того, когда установлен определенный флаг ‘Y’
У меня нет большого опыта в создании триггеров, но пока это то, что у меня есть
create or replace
TRIGGER ADD_CREATE_DT
after UPDATE of approved ON articles
for each row
BEGIN
:new.create_dt := sysdate where approved = 'Y';
END;
Я получаю эту ошибку при обновлении столбца
триггер ‘USER.ADD_CREATE_DT’ недействителен и не прошел повторную проверку
Есть идеи?
Спасибо
Ответ №1:
Используйте предложение WHEN:
create or replace
TRIGGER ADD_CREATE_DT
after UPDATE of approved ON articles
for each row
when (new.approved = 'Y')
BEGIN
:new.create_dt := sysdate;
END;
Или используйте, ЕСЛИ:
create or replace
TRIGGER ADD_CREATE_DT
after UPDATE of approved ON articles
for each row
BEGIN
if :new.approved = 'Y' then
:new.create_dt := sysdate;
end if;
END;
В этом случае, КОГДА является более подходящим и эффективным.
Комментарии:
1. Спасибо — не удалось заставить «КОГДА» работать, но «ЕСЛИ» работает отлично
Ответ №2:
create or replace
TRIGGER ADD_CREATE_DT
after UPDATE of approved ON articles
for each row
BEGIN
IF :NEW.approved = 'Y' THEN
:new.create_dt := sysdate;
END IF;
END;
Ответ №3:
Я не знаю, какую версию Oracle вы используете? В Oracle 10g я получил следующую ошибку:
ORA-04084: cannot change NEW values for this trigger type
04084. 00000 - "cannot change NEW values for this trigger type"
*Cause: New trigger variables can only be changed in before row
insert or update triggers.
*Action: Change the trigger type or remove the variable reference.
Это не позволяет изменять поле после триггеров.
Комментарии:
1.
BEFORE
Триггер определенно кажется более подходящим в этом случае (когда обновляемый столбец принадлежит той же таблице, в которой включен триггер).