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