2013-07-11 3 views
0

레코드가 테이블에 삽입되는 경우 레코드를 몇 개로 분할하여 삽입해야하는 경우가 있습니다.INSERT 문이있는 INSERT 문

로직은 INSERT 트리거 이전에 발생하는 INSERT 트리거 내부에 작성됩니다. 이 트리거 내에서 INSERT 문을 실행하려고하는데, 그 결과 트리거의 재귀 호출이 발생합니다. 그러나 나는 이것이 일어나기를 원하지 않는다. 나는

execute immediate 'ALTER TRIGGER sale_trigger DISABLE';

처럼 떨어지게를 사용하여 몸에서 트리거를 해제하려고하지만, 분명히이 확약 조작이며, 따라서 트리거 내부에서 작업을 나던.

트리거의 재귀 호출을 어떻게 피할 수 있습니까?

편집 내 방아쇠를 declare PRAGMA AUTONOMOUS_TRANSACTION;으로 선언 했으므로 이제 alter 문을 실행할 수 있습니다. 그러나 동일한 트리거에서 트리거를 비활성화하면 PLSQL 개발자가 작업을 중지합니다. 나는 무엇을해야합니까? :)

+0

아마도 데이터가 삽입되기 시작한 것과 같이 트리거가 두 번째로 호출되고 있음을 어떻게 알 수 있습니까? 따라서 이것을 트리거에서 직접 확인할 수 있으며 두 번째 호출의 경우 삽입을 호출하지 않습니다. – Mikhail

+0

Havent는 방아쇠가 처음으로 호출되는지 여부를 식별하는 방법을 발견했습니다. 분석 데이터가 내 사건에 도움이 될 것 같지 않아 – Dennis

+1

내가 발견 한 관리 방법은 대상 테이블에서 트리거를 통해 삽입되는 값에 따라 다른 기본값이있는 추가 열만 있으므로 트리거가이를 확인하고 ' 기본값과 다른 경우 삽입하지 마십시오. 비록 당신이 데이터 구조를 바꿀 수 없다면, 특히, 좋지 않은 것 같습니다 ... – Mikhail

답변

0

첫 번째 삽입을 목표 테이블에 직접로드하는 대신 레코드를 스테이징 테이블에 삽입하십시오. 문제가있는 논리가있는 트리거가 준비 테이블에 있어야합니다. 논리가 적용되지 않으면 트리거가 행을 목표 테이블에 삽입합니다. 논리가 적용되면 트리거는 행을 삽입하고 (필요하면?) 대상 테이블에 필요한 추가 삽입이 필요한지 여부를 결정합니다. 스테이징 테이블을 작고 효율적으로 유지하기 위해 일정한 간격으로 자릅니다 (그러나 효율성이 떨어지므로 각 트리거 조작 이후가 아닐 수도 있음).

즉, 트리거가 삽입되는 테이블에서 트리거를 분리합니다.