Триггер Oracle SQL при обновлении столбца

#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 Триггер определенно кажется более подходящим в этом случае (когда обновляемый столбец принадлежит той же таблице, в которой включен триггер).