powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
4 сообщений из 4, страница 1 из 1
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
    #37107104
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, то если триггер 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
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
    #37107522
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Должен ли триггер срабатывать при изменении приложением поля END_DATE?
...
Рейтинг: 0 / 0
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
    #37107805
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не должен. Должен реагировать только на изменения 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
Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
    #37108229
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, такой способ помог. Спасибо за помощь.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как сделать, чтобы триггер ALTER_UPDATE проводил UPDATE записи и не вызывал сам себя?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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