![]() |
|
Обойти 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) В том то и печаль, что триггер я писала, а вот процедура не мое творение((
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |