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

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

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

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

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

Я вот над Вашими словами поразмыслил. Вы имеете ввиду исользовать MERGE? Или типа того?
Я просто ничего другого не знаю чтоб прям в INSERT прописать "не вставлял дублирующую запись"
Подскажите тогда плз.
...
Рейтинг: 0 / 0
22.09.2008, 12:35
    #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
22.09.2008, 13:20
    #35551973
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибок в триггере
omentosОб этом тоже думал, но посчитал, что все намного проще и можно прям в триггере делать.
Просто во многих печатных изданиях пишут, что триггер - это та же ХП, которая вызывается автоматически по событию (INSERT, UPDATE, DELETE). Вот и подумал.
Тем не менее, в случае DB2 внутри тела триггера синтаксис урезан по сравнению с SP.
...
Рейтинг: 0 / 0
22.09.2008, 13:26
    #35551993
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибок в триггере
Mark BarinsteinТак что, нельзя написать этот инсерт так, чтоб он не вставлял дубли в log?
Или я неправильно понял задачу?

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

merge, конечно, тоже выход из положения.
...
Рейтинг: 0 / 0
22.09.2008, 14:56
    #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
22.09.2008, 16:19
    #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
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Обработка ошибок в триггере / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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