언제 발사를 유발하고 그렇지 않을 때
-
12-09-2019 - |
문제
SQL Server 2005의 트리거에 관한 꽤 일반적인 질문.
어떤 상황에서 테이블 트리거가 발사되고 어떤 상황이 그렇지 않습니까?
시연 할 코드 예제는 훌륭합니다.
감사 기반 데이터베이스를 작성하고 있으며 테이블에 업데이트, 삭제 및 삽입을 위해 설정 한 트리거를 해제하지 못하는 상황을 알고 싶어합니다.
내가 의미하는 바의 예,
UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);
다음 명령문은 업데이트 트리거를 한 번만 해고합니다.
해결책
그들이 언제 발사하기를 원하십니까?
CREATE TRIGGER AFTER ACTION
행동 후에 실행됩니다 (insert update delete
) 헌신적. INSTEAD OF
행동 대신 방아쇠를 발사합니다.
트리거가있는 가장 큰 gotchas 중 하나는 행동이 수행 될 때마다 발사한다는 것입니다. 줄에 영향을 미치지 않더라도. 이것은 버그가 아니며, 조심하지 않으면 꽤 빨리 태울 수있는 것입니다.
또한 트리거를 사용하면 사용할 것입니다 inserted
그리고 deleted
테이블. 업데이트 된 행은 둘 다에 나열되어 있습니다. 이것은 많은 사람들을 버립니다. 왜냐하면 그들은 update
A로 delete
그 다음에 insert
.
MSDN 문서는 실제로 발사를 유발할 때와 어떤 영향을 미치는지에 대한 심도있는 토론을 가지고 있습니다. 여기.
다른 팁
2008 년에는 내장을 사용할 수 있습니다 데이터 캡처를 변경하십시오
또한 트리거가 발사하지 않는 상황이 꽤 많이 있습니다.
· 테이블이 떨어졌습니다.
· 테이블이 잘립니다.
· 중첩 및/또는 재귀 트리거에 대한 설정은 트리거가 발사되는 것을 방지합니다.
· 데이터가 벌크로드되어 트리거를 우회합니다.
다음 명령문은 업데이트 트리거를 한 번만 해고합니다.
모든 동작 유형 문은 영향을받는 행 수에 관계없이 한 번만 트리거를 발사하면 여러 행 인서트/업데이트/삭제를 처리하기 위해 트리거를 작성해야합니다.
트리거가 삽입되거나 삭제 된 가문관에있는 한 번에 하나의 행에만 의존하는 경우 실패합니다. 그리고 더 나쁜 것은 오류가 발생하지 않을 것입니다. 트리거가하는 모든 일에 영향을받는 모든 행에 영향을 미치지 않습니다. 트리거의 루프 나 커서를 통해이 문제를 해결하지 말고 설정 기반 로직으로 변경하십시오. 트리거의 커서는 전체 앱을 삐걱 거리는 중단으로 가져올 수 있으며 500,000 개의 레코드 프로세스를 기록하고 몇 시간 동안 테이블을 고정시킵니다.
패스 트리거로 벌크 인서트를 사용하도록 지정하지 않는 한. 트리거를 통과하게하면 트리거에서 발생하는 모든 일이 벌크 인서트 후에도 발생하는지 확인하기 위해 코드가 필요하므로이를 알고 있어야합니다. 또는 fire_triggers 옵션으로 벌크 인서트를 호출해야합니다.
Eric이 방아쇠가 발사되지 않는 상황을 게시 한 링크에서 강조 할 것이라고 생각했습니다.
잘린 테이블 문은 실제로 삭제이지만 작업이 개별 행 삭제를 기록하지 않기 때문에 트리거를 활성화 할 수 없습니다. 그러나 자르기 테이블을 실행하기위한 테이블에 권한이있는 사람들 만 자리한 테이블 문으로 삭제 트리거를 우연히 우회하는 것에 대해 우려해야합니다.