Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 493
Если я правильно понимаю, то если триггер ALTER_UPDATE проводит какое-то обновление, то он вызывает сам себя. Например, вот такой триггер (при обновлении одного поля в записи он работает около 4 секунд):
CREATE OR REPLACE TRIGGER FORM.AFTER_UPDATE
  AFTER UPDATE
  ON SCHEMA.TABLE
  REFERENCING 
    NEW AS new_
    OLD AS old_
  FOR EACH ROW
  BEGIN ATOMIC
    
    DECLARE OLD_START_DATE_AFTER DATE;
    DECLARE OLD_START_DATE_BEFORE DATE;

    
    IF (new_.START_DATE is not null) and (old_.start_date is null)
    THEN
    
      SET OLD_START_DATE_AFTER = (select coalesce(min(t.start_date), '01.01.2999') 
          FROM SCHEMA.TABLE t 
          WHERE t.id = new_.id and t.START_DATE > new_.start_date);
          
          
      SET OLD_START_DATE_BEFORE = (select coalesce(max(t.start_date), '01.01.2999') 
          FROM SCHEMA.TABLEt 
          WHERE t.id = new_.id and t.START_DATE < new_.start_date);
      
      IF (OLD_START_DATE_AFTER > new_.start_date) and (OLD_START_DATE_AFTER <> '01.01.2999') THEN
      
        UPDATE SCHEMA.TABLE t SET t.END_DATE = OLD_START_DATE_AFTER-1 day
          WHERE t.ID = new_.id and t.START_DATE = new_.start_date;
          
      END IF;
      
      IF (OLD_START_DATE_BEFORE <> '01.01.2999')THEN
      
        UPDATE SCHEMA.TABLE t SET t.END_DATE = new_.START_DATE -1 day
          WHERE t.ID = new_.id and t.START_DATE = OLD_START_DATE_BEFORE;
          
      END IF;
      
    END IF;
    
  END;
Может быть я не прав?

Если же прав, то как вариант предложено следующее: Триггер не вносит никаких изменений, а вызывает процедуру. Процедура отключает триггер и производит необходимые изменения. Потом включает триггер. Можно ли так поступить? Или в триггере UPDATE сделать DELETE и INSERT? Или есть другие способы?
Как лучше?
9 фев 11, 15:44    [10209241]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Должен ли триггер срабатывать при изменении приложением поля END_DATE?
9 фев 11, 18:11    [10210413]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 493
Нет, не должен. Должен реагировать только на изменения START_DATE.

Я прочитал в справке, что можно указать столбцы, на которые должен реагировать триггер. Вот так:

CREATE OR REPLACE TRIGGER FORM.AFTER_UPDATE
  AFTER UPDATE START_DATE
  ON SCHEMA.TABLE
  REFERENCING 
    NEW AS new_
    OLD AS old_
  FOR EACH ROW
  BEGIN ATOMIC

Завтра с утра на работе попробую.
9 фев 11, 20:47    [10211060]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 493
Да, такой способ помог. Спасибо за помощь.
10 фев 11, 09:25    [10212163]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить