Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя? / 4 сообщений из 4, страница 1 из 1
09.02.2011, 15:44
    #37107104
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
Если я правильно понимаю, то если триггер ALTER_UPDATE проводит какое-то обновление, то он вызывает сам себя. Например, вот такой триггер (при обновлении одного поля в записи он работает около 4 секунд):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
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? Или есть другие способы?
Как лучше?
...
Рейтинг: 0 / 0
09.02.2011, 18:11
    #37107522
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
Должен ли триггер срабатывать при изменении приложением поля END_DATE?
...
Рейтинг: 0 / 0
09.02.2011, 20:47
    #37107805
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
Нет, не должен. Должен реагировать только на изменения START_DATE.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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

Завтра с утра на работе попробую.
...
Рейтинг: 0 / 0
10.02.2011, 09:25
    #37108229
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
Да, такой способ помог. Спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]