programing

쿼리가 주어지면 어떤 트리거가 발생하는지 알 수 있습니까?

starjava 2023. 9. 4. 19:28
반응형

쿼리가 주어지면 어떤 트리거가 발생하는지 알 수 있습니까?

트리거가 너무 많은 데이터베이스가 있습니다.그들은 캐스케이드를 할 수 있습니다.

단순해 보이는 질문이 하나 있는데, 모든 트리거의 효과를 전혀 기억할 수 없습니다.그래서, 그 간단한 질문은 실제로 전혀 간단하지 않고 제가 기대하는 것을 하지 않을 수도 있습니다.

쿼리를 실행하기 전에 어떤 트리거가 실행되는지 또는 쿼리를 실행한 후 어떤 트리거가 실행되었는지(아직 커밋되지 않음) 알 수 있는 방법이 있습니까?

저는 다음과 같은 질문에는 별로 관심이 없습니다.SELECT … FROM user_triggers WHERE …왜냐하면 나는 그것들을 이미 알고 있고, 또한 그것이 내 쿼리에서 트리거의 발사 조건이 충족될지 여부를 알려주지 않기 때문입니다.

감사해요.

"트리거가 너무 많은 데이터베이스를 가지고 있습니다.그들은 캐스케이드를 할 수 있습니다."

이것이 많은 사람들이 트리거를 해부하는 이유 중 하나일 뿐입니다.

"쿼리를 실행하기 전에 어떤 트리거가 실행되는지 알 수 있는 방법이 있습니까?"

아니요. 업데이트 트리거 본문에서 찾을 수 있는 것을 고려해 보겠습니다.

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_를 재귀적으로 검색하는 것이 최선입니다.트리거 및 DBA_Dependencies는 캐스케이드에 포함될 수 있는 모든 트리거를 식별합니다.그러나 어떤 시나리오에서 어떤 것이 확실히 발사될지는 확인할 수 없을 것입니다.

또는 실행 후 어떤 트리거가 실행되었습니까(아직 커밋되지 않음)?"

다른 사람들이 지적했듯이, 로깅은 한 가지 옵션입니다.그러나 Oracle 11g을 사용하는 경우에는 PL/SQL 계층 프로파일러라는 다른 옵션이 있습니다.이 도구는 트리거를 포함하여 PL/SQL 호출에 의해 터치된 모든 PL/SQL 프로그램 단위를 추적하는 비침습적인 도구입니다.계층 프로파일러의 멋진 기능 중 하나는 다른 스키마에 속하는 PU가 포함되어 있다는 점이며, 이는 계단식 트리거에 유용할 수 있습니다.

따라서 SQL을 익명 블록으로 묶고 계층 프로파일러와 함께 호출하기만 하면 됩니다.그런 다음 보고서를 필터링하여 발생한 트리거만 표시할 수 있습니다.자세히 알아봅니다.

쿼리를 실행하기 전에 어떤 트리거가 실행되는지 또는 쿼리를 실행한 후 어떤 트리거가 실행되었는지(아직 커밋되지 않음) 알 수 있는 방법이 있습니까?

이 문제를 해결하기 위해 PL/SQL 디버거를 사용하여 익명 블록 내에서 쿼리를 실행합니다.

쿼리를 통해 구문 분석하고 쿼리와 관련된 트리거를 제공하는 것은 없습니다.이것처럼 간단할 것입니다.실행 중인 쿼리에서 테이블 이름을 선택하고 쿼리를 실행하기 전에 각 테이블 이름에 대해 다음 쿼리를 사용하여 트리거를 나열하기만 하면 됩니다.그것은 충분히 간단하지 않습니까?

select  trigger_name
,   trigger_type
,   status
from    dba_triggers
where   owner = '&owner'
and table_name = '&table'
order by status, trigger_name

언급URL : https://stackoverflow.com/questions/9395299/is-it-possible-to-know-what-triggers-would-fire-given-a-query

반응형