powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Обработка ошибок в триггере
11 сообщений из 11, страница 1 из 1
Обработка ошибок в триггере
    #35551588
omentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача вроде простая, но все варианты, которые удалось найти не прошли по синтаксису.

Существует таблица с триггером на UPDATE.
Триггер пишет записи в другую таблицу (одно из полей имеет индекс уникальности) на основе данных таблицы-источника. При попытке триггера отработать вставку записи с нарушением уникальности возвращается ошибка и UPDATE не проходит. Как в триггере применить обработку такой ошибки и просто ничего не делать в случае появления ошибки? т.е. Запись в новую таблицу не вставлять, но в источнике UPDATE должен пройти.

На данный момент временно используется проверка на существование записи через WHEN триггера. Но такой вариант не красивый да и наверное грузит систему сильнее.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551658
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что-то неудобно делать в теле триггера, это можно оформить как хранимую процедуру, и вызывать из триггера. А синтаксис SQL PL внутри хранимой процедуры куда богаче, чем в теле триггера.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551692
omentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Об этом тоже думал, но посчитал, что все намного проще и можно прям в триггере делать.
Просто во многих печатных изданиях пишут, что триггер - это та же ХП, которая вызывается автоматически по событию (INSERT, UPDATE, DELETE). Вот и подумал.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551709
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
omentosСуществует таблица с триггером на UPDATE.
Триггер пишет записи в другую таблицу (одно из полей имеет индекс уникальности) на основе данных таблицы-источника. При попытке триггера отработать вставку записи с нарушением уникальности возвращается ошибка и UPDATE не проходит. Как в триггере применить обработку такой ошибки и просто ничего не делать в случае появления ошибки? т.е. Запись в новую таблицу не вставлять, но в источнике UPDATE должен пройти.

На данный момент временно используется проверка на существование записи через WHEN триггера. Но такой вариант не красивый да и наверное грузит систему сильнее.У вас настолько сложный insert в новую таблицу, что невозможно написать его так, чтобы он просто не вставлял дублирующую запись?
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551815
omentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinУ вас настолько сложный insert в новую таблицу, что невозможно написать его так, чтобы он просто не вставлял дублирующую запись?

Нет, не сложный.
Я сейчас пока так примерно и сделал. В WHEN запихал проверку на наличие записи. Если нет, то триггер с ИНСЕРТОМ отработает, а если есть, то не отработает.
Создал нужные индексы и все вроде работает нормально и достаточно быстро. Просто это выглядит совсем не профессионально.
Я такой человек, что люблю совершенствоваться и если мне кажется, что может быть лучше и быстрее работать, то я стараюсь научиться этому.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551840
omentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinУ вас настолько сложный insert в новую таблицу, что невозможно написать его так, чтобы он просто не вставлял дублирующую запись?

Я вот над Вашими словами поразмыслил. Вы имеете ввиду исользовать MERGE? Или типа того?
Я просто ничего другого не знаю чтоб прям в INSERT прописать "не вставлял дублирующую запись"
Подскажите тогда плз.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551852
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
omentosЯ сейчас пока так примерно и сделал. В WHEN запихал проверку на наличие записи. Если нет, то триггер с ИНСЕРТОМ отработает, а если есть, то не отработает.Триггер с инсертом? Зачем он? Что он делает?
Не могли бы вы схематично привести свой пример?
Я думал, что у вас примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
create trigger tab_au after update on tab 
...
begin 
 ...
 insert into log ...;
 ...
end@
Так что, нельзя написать этот инсерт так, чтоб он не вставлял дубли в log?
Или я неправильно понял задачу?
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551973
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
omentosОб этом тоже думал, но посчитал, что все намного проще и можно прям в триггере делать.
Просто во многих печатных изданиях пишут, что триггер - это та же ХП, которая вызывается автоматически по событию (INSERT, UPDATE, DELETE). Вот и подумал.
Тем не менее, в случае DB2 внутри тела триггера синтаксис урезан по сравнению с SP.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35551993
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinТак что, нельзя написать этот инсерт так, чтоб он не вставлял дубли в log?
Или я неправильно понял задачу?

Если это действительно лог, то там того unique constraint'а вообще быть не должно (только какой-нибудь суррогатный ключ и не более того). Значит, это не лог. Хотя, если это не лог, то что же это?

merge, конечно, тоже выход из положения.
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35552233
omentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, это не лог, это таблица, куда при определенных условиях попадает часть данных.
Вы конечно спросите почему этим не занимается прога, которая пишет данные в первую таблицу. Действительно так было бы легче. Просто так сложилось, что программу доработать нельзя, а можно использовать только плод ее работы - таблицу-источник. Вот и было принято решение по быстрому сlделать небольшой триггер, но вся загвоздка в том, что в таблице источника одна и та же запись может обновляться несколько раз, но записать в таблицу-получатель нужно только один первый раз.

В итоге вышел такой триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TRIGGER trname
AFTER
  UPDATE
  ON tablename
  REFERENCING
    NEW AS NROWS
  FOR EACH ROW
  MODE DB2SQL
  WHEN (NROWS.PRINTDATETIME is not null and NROWS.NOTIF_STATUS_ID<> 4  and (select count(*) from newnotif.tchargedoc where notifversion=nrows.sid)= 0 )
  BEGIN ATOMIC
      INSERT INTO NEWNOTIF.TCHARGEDOC(NOTIFSID, PERIOD, ATNK, RNN, FIO, 
        NOTIFVERSION, NOTIFPRINTDATETIME, NOTIFNO)
        VALUES(NROWS.SID, NROWS.PERIOD, NROWS.ATNK, NROWS.RNN, NROWS.FIO, 
          NROWS.SID, NROWS.PRINTDATETIME, NROWS.NOTIFNO);
END
В таблице tchargedoc уникальность должна соблюдаться по полю notifversion
...
Рейтинг: 0 / 0
Обработка ошибок в триггере
    #35552498
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TRIGGER trname AFTER UPDATE ON tablename
REFERENCING NEW TABLE AS N
FOR EACH STATEMENT
      INSERT INTO NEWNOTIF.TCHARGEDOC(
        NOTIFSID, PERIOD, ATNK, RNN, FIO, NOTIFVERSION, NOTIFPRINTDATETIME, NOTIFNO
      )
      SELECT SID, PERIOD, ATNK, RNN, FIO, SID, PRINTDATETIME, NOTIFNO
      FROM (
        SELECT  SID, PERIOD, ATNK, RNN, FIO, SID, PRINTDATETIME, NOTIFNO
          , rownumber () over (partition by sid) rn
        from N
        where PRINTDATETIME is not null and NOTIF_STATUS_ID<> 4 
      ) a
      where rn= 1  and not exists (select  1  from newnotif.tchargedoc where notifversion=a.sid);
Если у вас никогда не будет одним запросом изменяться несколько записей с одинаковым trname.sid, то можно упростить запрос, выкинув нумерацию внутри sid.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Обработка ошибок в триггере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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