Имя: Пароль:
IT
Админ
Обойти commit в триггере
0 Злобная Печенька
 
16.09.14
16:46
Всем привет. Взываю к знатокам pl/sql. Задача - на табличке висит триггер, на инсерт. Триггер вызывает процедурку, которая начинает обработку заинсерченных строк. Проблема в том, что в процедурке присутствует commit, который и не дает нормально работать ни триггеру, ни процедуре. Внимание вопрос- как можно обойти эту проблему,если и триггер нужен и в сторону анонимных транзакций копать не надо (из-за нежелательной возможности рассогласования данных)? Может кто сталкивался?
1 Dmitry1c
 
16.09.14
16:48
Убрать commit?
2 Злобная Печенька
 
16.09.14
16:49
(1) Тоже не лучший вариант, так как он нужен. (В процедуре идет изменение данных)
3 Dmitry1c
 
16.09.14
16:49
(2) я как понимаю, процедура вызывается кучу раз

commit выполнять отдельной процедурой после выполнения всех действий?
4 Злобная Печенька
 
16.09.14
16:50
(3) Интересный способ, надо подумать....
5 Dmitry1c
 
16.09.14
16:51
(4) а разве триггер сам по себе не работает в рамках транзакции? я не уверен конечно
6 Dmitry1c
 
16.09.14
16:51
(4) посмотри профайлером, если он есть у постгре
7 Dmitry1c
 
16.09.14
16:53
Гугл говорит, что триггер работает в рамках транзакции, которая вызвала триггер
8 Dmitry1c
 
16.09.14
16:53
(7) что логично, кстати
9 spectre1978
 
16.09.14
16:55
(0) напрягши память, вспоминаю, что триггер на строку работает в рамках транзакции. Но у оракла есть еще триггер на операцию. Вот он, по-моему, может свои транзакции запускать
10 Злобная Печенька
 
16.09.14
16:55
(8) угу, только есть необходимость использования DML команд, исполнение которых как раз желательно закоммитить
11 Злобная Печенька
 
16.09.14
16:56
(9) >> Вот это уже интересно... спасибо, покопаю
12 Dmitry1c
 
16.09.14
16:57
(10) >необходимость использования DML команд

дак если DML-команды идут в рамках транзакции, зачем еще транзакции?

может я туплю конечно, но где логика?
13 Злобная Печенька
 
16.09.14
16:59
(12) логика есть)))) заинсерченную строку нужно обработать, перенести и удалить из таблицы. Вот как раз после удаления нужен коммит
14 Dmitry1c
 
16.09.14
17:00
(13) но если это итак происходит в рамках транзакции, зачем еще и DML-команды оборачивать в отдельные транзакции?
15 Злобная Печенька
 
16.09.14
17:01
(13) правда триггер запускается не на каждую строку, а после добавления. ТО есть операторный триггер
16 Dmitry1c
 
16.09.14
17:01
все, до меня дошло.
17 Злобная Печенька
 
16.09.14
17:02
(15) то есть все таки не может( Либо процедуру переписывать придется
18 spectre1978
 
16.09.14
17:04
(11) Нет, жаль конечно, но склероз меня подвел. Даже в операторном триггере нельзя управлять транзакциями :(
19 Злобная Печенька
 
16.09.14
17:12
(18) В том то и печаль, что триггер я писала, а вот процедура не мое творение((
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.