Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как отследить последовательность выполнения триггеров?  [new]
AlexP
Member

Откуда: СПб
Сообщений: 594
На таблице висит несколько триггеров, и они зацикливаются в бесконечную рекурсию. Как бы отследить последовательность их вызовов? Можно писать в каждом в отладочную таблицу, но, насколько понимаю, извне транзакции ничего не увидишь. Есть ли какой-нибудь оператор типа print, пишущий в output? Или написать внешнюю ХП, пишущую в файл? Тогда не подскажете ссылку, как писать внешние ХП на дельфях?
19 мар 07, 17:03    [3915992]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Можно использовать PIPE, можно автономные транзакции.
19 мар 07, 17:07    [3916019]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
Змей Равниныч
Member

Откуда: Из тридевятого царства
Сообщений: 284
AlexP
На таблице висит несколько триггеров, и они зацикливаются в бесконечную рекурсию. Как бы отследить последовательность их вызовов? Можно писать в каждом в отладочную таблицу, но, насколько понимаю, извне транзакции ничего не увидишь. Есть ли какой-нибудь оператор типа print, пишущий в output? Или написать внешнюю ХП, пишущую в файл? Тогда не подскажете ссылку, как писать внешние ХП на дельфях?
Event 10309
19 мар 07, 17:07    [3916022]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
DВА
Member

Откуда:
Сообщений: 5439
sys.dbms_system.ksdwrt
... но... странно это все...
19 мар 07, 17:08    [3916024]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Тут, имхо, не отслеживать надо, а объединять логику в один програм-юнит
на каждый trigger_type + triggering_event
19 мар 07, 17:14    [3916064]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
AlexP
Member

Откуда: СПб
Сообщений: 594
триггеров много потому, что в них надо писать в ту же таблицу, к тому же половина триггеров на одну колонку, остальные - на все
19 мар 07, 17:18    [3916094]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
AlexP
триггеров много потому, что в них надо писать в ту же таблицу, к тому же половина триггеров на одну колонку, остальные - на все

В природе нет ситуации, когда необходимо иметь больше одного
триггера на каждый тип+ивент
19 мар 07, 17:27    [3916141]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
AlexP
Member

Откуда: СПб
Сообщений: 594
а как написать триггер, меняющий ту же таблицу?
19 мар 07, 17:38    [3916217]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
Добр.
Guest
AlexP
а как написать триггер, меняющий ту же таблицу?
Делать изменения через процедуру, там же, распологать и логику из триггера.
19 мар 07, 17:44    [3916247]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
AlexP
а как написать триггер, меняющий ту же таблицу?

читайте внимательнее - я не совсем это предлагал
SQL> select trigger_type||'+'||triggering_event tpev from all_triggers
  2  where base_object_type='TABLE'
  3  group by trigger_type,triggering_event;

TPEV
-------------------------------------------------
AFTER EACH ROW+INSERT
AFTER STATEMENT+UPDATE
AFTER EACH ROW+INSERT OR UPDATE OR DELETE
BEFORE EACH ROW+INSERT OR UPDATE
BEFORE STATEMENT+INSERT OR UPDATE OR DELETE
AFTER EACH ROW+DELETE
BEFORE EACH ROW+UPDATE
BEFORE STATEMENT+INSERT
BEFORE EACH ROW+INSERT OR UPDATE OR DELETE
BEFORE EACH ROW+UPDATE OR DELETE
BEFORE EACH ROW+INSERT
AFTER EACH ROW+UPDATE
AFTER STATEMENT+UPDATE OR DELETE
BEFORE EACH ROW+DELETE
19 мар 07, 17:48    [3916262]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
AlexP
Member

Откуда: СПб
Сообщений: 594
orawish
В природе нет ситуации, когда необходимо иметь больше одного
триггера на каждый тип+ивент


Видимо, разработчики Oracle этого не знали и сделали такую фичу
19 мар 07, 17:50    [3916272]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
Ales Protiv
Member

Откуда: Прага
Сообщений: 1872
Поправьте, если я ошибаюсь. Думается мне, что несколько триггеров одного типа на одну таблицу вызываются в случайном порядке, и Oracle не гарантирует что порядок будет всегда одинаковым.
Присоединяюсь к orawish.
19 мар 07, 17:52    [3916282]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63951
Блог
orawish
В природе нет ситуации, когда необходимо иметь больше одного триггера на каждый тип+ивент

"Необходимо" - нет. Ровно как в природе нет ситуации, когда необходимо иметь триггера before и for each row :)

"Удобно" - другой вопрос. Согласен, логику желательно объединять в одном триггере, но есть ситуации, когда удобно иметь разные (скажем, на половине таблиц висит триггер XXX_SOMETASK, выполняющий некую особую роль, скажем, аудит, и никак не пересекающийся с "нормальными").

В то же время раз возникает вопрос по порядку вызова - значит, они таки зависимы, значит, логика на разных триггерах в этом месте недопустима.
19 мар 07, 17:57    [3916298]     Ответить | Цитировать Сообщить модератору
 Re: Как отследить последовательность выполнения триггеров?  [new]
Александр Соколов
Member

Откуда: Протвино
Сообщений: 1419
http://www.oracle.com/global/ru/oramag/dec2006/w_dev_asktom_o26.html
Том Кайт
"Почему в СУБД Oracle вообще разрешается использование множественных триггеров одного и того же типа"? Причина восходит к первоначальной реализации в сервере Oracle Database механизма тиражирования. В журналах материализованных представлений (materialized view logs) – раньше в версии 7.0 они назывались просто журналами моментальных копий (snapshot logs) – для регистрации операций языка манипулирования данными (DML), которые выполнялись на данной таблице, использовались триггеры базы данных. До поддержки в сервере базы данных множественных триггеров одного и того же типа это накладывало на разработчиков ограничение: либо не использовать сам этот тип триггеров (который уже использовался сервером Oracle), либо не использовать журналы материализованных представлений. Ни один из тех вариантов не был привлекательным, поэтому в сервер базы данных была добавлена возможность использования множественных триггеров одного и того же типа.
19 мар 07, 18:00    [3916311]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить