Можно ли узнать, какие триггеры будут срабатывать при запросе? - PullRequest
11 голосов
/ 22 февраля 2012

У меня есть база данных с (слишком) многими триггерами. Они могут каскадно.

У меня есть запрос, который кажется простым, и я никак не могу вспомнить влияние всех триггеров. Таким образом, этот простой запрос может быть совсем не простым и не делать то, что я ожидаю.

Есть ли способ узнать, какие триггеры сработают перед выполнением запроса или какие триггеры сработали после его выполнения (еще не зафиксировано)?

Меня не очень интересуют такие запросы, как SELECT … FROM user_triggers WHERE …, потому что я их уже знаю, а также потому, что он не сообщает мне, будут ли выполнены условия срабатывания триггеров в моем запросе.

Спасибо

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

"У меня есть база данных с (слишком) большим количеством триггеров. Они могут каскадироваться."

Это всего лишь одна из причин, по которой многие люди испытывают анестезию триггеров.

"Есть ли способ узнать, какие триггеры сработают, прежде чем запускать запрос "

Нет. Давайте рассмотрим что-то, что вы можете найти в теле триггера UPDATE:

if :new.sal > :old.sal * 1.2 then
    insert into big_pay_rises values (:new.empno, :old.sal, :new.sal, sysdate);
end if;

Как мы можем определить, сработает ли триггер на BIG_PAY_RISES? Возможно, это не зависит от алгоритма, который мы не можем разобрать в выражении DML.

Итак, лучшее, на что вы можете надеяться, это рекурсивный поиск DBA_TRIGGERS и DBA_DEPENDENCIES, чтобы определить все триггеры, которые может иметь в вашем каскаде. Но будет невозможно определить, какие из них обязательно сработают в любом заданном сценарии.

"или какие триггеры сработали после его запуска (еще не зафиксировано)?"

Как отмечали другие, ведение журнала является одним из вариантов. Но если вы используете Oracle 11g, у вас есть другой вариант: PL / SQL Hierarchical Profiler. Это ненавязчивый инструмент, который отслеживает все программные блоки PL / SQL, которых коснулся вызов PL / SQL, , включая триггеры . Одна из замечательных особенностей Hierarchical Profiler заключается в том, что он включает PU, которые принадлежат другим схемам, что может быть полезно при каскадных триггерах.

Итак, вам просто нужно обернуть ваш SQL в анонимный блок и вызвать его с помощью Hierarchical Profiler. Затем вы можете отфильтровать отчет, чтобы выявить только триггеры, которые сработали. Узнать больше .

1 голос
/ 01 марта 2012

Есть ли способ узнать, какие триггеры сработали до запуска запроса, или какие триггеры сработали после его выполнения (еще не зафиксировано) ?

Чтобы решить эту проблему, я бы запустил запрос внутри анонимного блока с использованием отладчика PL / SQL.

0 голосов
/ 25 февраля 2012

Не существует такой вещи, как анализ вашего запроса и запуск триггеров, задействованных в вашем запросе.Это будет так просто.Просто выберите имена таблиц в запросе, который вы выполняете, и для каждого из них просто перечислите триггеры, используя следующий запрос, прежде чем выполнять запрос.Разве это не достаточно просто?

select  trigger_name
,   trigger_type
,   status
from    dba_triggers
where   owner = '&owner'
and table_name = '&table'
order by status, trigger_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...