문제

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이 방아쇠가 발사되지 않는 상황을 게시 한 링크에서 강조 할 것이라고 생각했습니다.

잘린 테이블 문은 실제로 삭제이지만 작업이 개별 행 삭제를 기록하지 않기 때문에 트리거를 활성화 할 수 없습니다. 그러나 자르기 테이블을 실행하기위한 테이블에 권한이있는 사람들 만 자리한 테이블 문으로 삭제 트리거를 우연히 우회하는 것에 대해 우려해야합니다.

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