powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 - помогите разобраться с транзакциями с триггерами
6 сообщений из 6, страница 1 из 1
DB2 - помогите разобраться с транзакциями с триггерами
    #36236056
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
помогите пожалуйста разобраться с транзакциями в триггерах.
Если триггер явно не поддерживает ROLLBACK, то как например откатить изменения если данные не удовлетворяют какому-нибудь условию.

Например такая шуточная логика - в поле мотоциклы нельзя добавлять марки машин.
Нужен триггер, который проверяет, что если вставленное значение равно "Жигули" то транзакцию нужно откатить.

Т.к. в самом триггере ROLLBACK делать нельзя, то я создал процедуру которая выполняет ROLLBACK и вызывается из триггера. Трюк не прошёл. Как только я пытался вставить "запрещённую" запись, я получил ошибку sqlcode: -751 - попытка выполнить неразрешённую комманду.

Подскажите как обрабатывать подобные случаи? И если можно, то в чём смысл запрещения отката изменения сделанных в триггере.

Например в Sybase можно откатить триггер и изменение которое вызвало откат.

Заранее спасибо.
...
Рейтинг: 0 / 0
DB2 - помогите разобраться с транзакциями с триггерами
    #36236432
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru,

Триггер не должен откатывать транзакции!
Если триггер обнаружил что вы что-то недопустимое делаете, то он должен выбросить код ошибки через команду SIGNAL (вроде).

Это и приведет к откату транзакции в том контексте где она была вызвана.
...
Рейтинг: 0 / 0
DB2 - помогите разобраться с транзакциями с триггерами
    #36236595
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kru,

Представляю себе сколько было бы сюрпризов, если можно было бы выполнить коммит или роллбэк в триггере. Втихаря. Шуточный пример:
Код: plaintext
1.
2.
  WHEN (O.Type <> 'Автомобиль')
         SIGNAL SQLSTATE '75201' ('Здесь только автомобили!' );
данный триггер вернёт ошибку, в ответ на которую можно адекватно прореагировать, например, выполнить роллбэк. Или конкретно, например, это триггер на изменение. Тогда при выполнении UPDATE, вызовется этот триггер, если запись - не имеет тип 'Автомобиль', то UPDATE вернёт ошибку с SQLSTATE 75201, что позволит нам понять, что нужно выполнить rollback.
...
Рейтинг: 0 / 0
DB2 - помогите разобраться с транзакциями с триггерами
    #36236934
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey KuznetsovЕсли триггер обнаружил что вы что-то недопустимое делаете, то он должен выбросить код ошибки через команду SIGNAL (вроде).

Это и приведет к откату транзакции в том контексте где она была вызвана.Нет.
Это приведёт не к откату транзакции, а к тому, что команда, вызвавшая срабатывание этого триггера, вернёт SQLCODE=-438 и SQLSTATE тот, который указан в команде SIGNAL .
...
Рейтинг: 0 / 0
DB2 - помогите разобраться с транзакциями с триггерами
    #36238308
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо.
Вроде удалось разобраться теперь.
Вот сделал небольшой примерчик, чтобы посмотреть как работает триггер.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table  моясхема.test_trg_rollback
(
    i integer,
    j integer
)
;
-- solution that works
create trigger моясхема.trg_rollback
after insert 
on моясхема.test_trg_rollback
referencing NEW as n
for each row
when (n.i = n.j) 
    SIGNAL SQLSTATE '75201' ('i must be different from j' )

Вставляю записи в анонимном блоке - ожидаю что всё откатится. Так оно и есть:
Код: plaintext
1.
2.
3.
4.
begin atomic
insert into моясхема.test_trg_rollback values ( 1 , 3 ) ;
insert into моясхема.test_trg_rollback values ( 2 , 3 ) ;
insert into моясхема.test_trg_rollback values ( 3 , 3 ) ;
end

Создал процедуру, которая в случае ошибки продолжает работать и просто возвращает последнюю ошибку. Ожидание, что откатится только одна вставка. Так и получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create procedure моясхема.test_tgr_proc (OUT SQLCODE_OUT INTEGER, OUT SQLSTATE_OUT CHARACTER( 5 ))
    language sql
begin 
       DECLARE v_had_errors char( 1 ) default 'N';
       DECLARE SQLCODE                 INTEGER DEFAULT  0        ;
       DECLARE SQLSTATE                char( 5 )  DEFAULT 'ZZZZZ'  ;
      DECLARE CONTINUE HANDLER FOR SQLEXCEPTION  values(SQLCODE,SQLSTATE ) INTO    SQLCODE_OUT, SQLSTATE_OUT;

    insert into моясхема.test_trg_rollback values ( 1 , 3 ) ;
    insert into моясхема.test_trg_rollback values ( 2 , 3 ) ;
    insert into моясхема.test_trg_rollback values ( 3 , 3 ) ;
   
end

Код: plaintext
call моясхема.test_tgr_proc (?,?)

Ещй раз огромное спасибо.
...
Рейтинг: 0 / 0
DB2 - помогите разобраться с транзакциями с триггерами
    #36238995
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinAlexey KuznetsovЕсли триггер обнаружил что вы что-то недопустимое делаете, то он должен выбросить код ошибки через команду SIGNAL (вроде).

Это и приведет к откату транзакции в том контексте где она была вызвана.Нет.
Это приведёт не к откату транзакции, а к тому, что команда, вызвавшая срабатывание этого триггера, вернёт SQLCODE=-438 и SQLSTATE тот, который указан в команде SIGNAL .

Да Марк, спасибо за уточнние, в принципе я это и имел ввиду, что в том месте где была вызвана команда вызвавшая срабатывания триггера будет возможность поймать этот сигнал и при желании вызвать роллбек или попытаться восстановится
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 - помогите разобраться с транзакциями с триггерами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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