문제

삽입 트리거가있는 테이블이 있습니다. 저장된 절차에서 하나의 삽입 문으로 6000 개의 레코드를이 테이블에 삽입하면 저장된 프로 시저가 삽입 트리거가 완료되기 전에 반환됩니까?

내가 올바르게 생각하는지 확인하기 위해, 트리거는 1 개의 삽입 문이 있었기 때문에 한 번만 '' '올바른 단어가 아니라고한다) 만 호출해야합니까?

내 주요 질문은 : 트리거가 완료되지 않은 경우에도 스프로크가 마감 될까요?

도움이 되었습니까?

해결책

삽입 트리거가 전체 삽입 문에 대해 한 번 실행됩니다. 이것이 사용하는 것이 중요한 이유입니다 inserted 실제로 삽입 된 내용을 볼 수있는 임시 테이블, 최신 단일 레코드를 선택하는 것이 아니라 그와 비슷한 것을 선택하십시오.

다른 팁

트리거는 거래의 일부입니다.

당신이 알아야 할 트리거에 대한 한 가지 중요한 점은 각 트랜잭션에 대해 트리거가 한 번 발생한다는 것입니다 (적어도 SQL Server에서는 다른 DBS를 확인해야하지만 행으로 행으로 처리하더라도 일반적으로 열악한 아이디어입니다). , 6000을 기록하면 트리거가 6000 번이 아닌 한 번 트리거가 발생합니다. 많은 사람들이 이것을 알지 못하고 마치 한 번에 하나의 레코드 씩 여러 레코드 삽입물을 처리하는 것처럼 트리거를 작성합니다. 이것은 사실이 아니며 트리거는 여러 레코드 삽입물을 건네 주어야합니다.

트리거 호출은 비동기식이 아닙니다. 삽입 절차에 대한 각 호출은 트리거가 발사되며 트리거가 완료 될 때까지 절차가 반환되지 않습니다.

쿼리 계획을 살펴보고 작동 방식을 확인하십시오. 트리거의 진술은 절차에 대한 각 호출에 대해 호출 될 것임을 알 수 있습니다.

문제는 트리거 기준이 충족 될 때마다 트리거가 발생합니다. 배치 처리 또는 거래에서 한 번 발사됩니다. 내 참조 레슨 101 방아쇠에

삽입 문에서 커서를 사용하여 트리거 행을 처리해야합니다. SQL Server의 트리거는 명령문 당 한 번에 한 번씩 발사되기 때문에 행당 한 번이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top