"У меня есть база данных с (слишком) большим количеством триггеров. Они могут каскадироваться."
Это всего лишь одна из причин, по которой многие люди испытывают анестезию триггеров.
"Есть ли способ узнать, какие триггеры сработают, прежде чем запускать
запрос "
Нет. Давайте рассмотрим что-то, что вы можете найти в теле триггера 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. Затем вы можете отфильтровать отчет, чтобы выявить только триггеры, которые сработали. Узнать больше .