2013-03-13 3 views
3

나는 매우 이상한 행동으로 보았다. insert-select 문을 만들고 select 부분에서 데이터가 반환되지 않으면 삽입 부분이 여전히 실행되고 심지어 삽입 트리거가 호출됩니다 (삽입 트리거에서 삽입 된 pseudotable에 0 행이 있음).삽입 할 데이터가 없을 때 삽입 트리거가 호출되는 이유는 무엇입니까?

예 :

insert into table1 column1 
select column1 from table2 where condition = 'Never met' 

출력 :

(0 row(s) affected) // 0 rows inserted 
(1 row(s) affected) // log from trigger 

이가 (한 번에 삭제 INSERT, UPDATE 선언) '보편적 인'트리거에 의해 야기 될 수 있습니까? 이것이 더 가설적인 질문 인 것과 나는이 행동을 받아 들여야 만한다는 것을 압니다. 그러나 이것이 왜 일어나는 것입니까? 나에게 의미가 없다. 나는 SQL 서버 2005

을 사용하고 - kwitee

답변

7

documented 그렇게 할 것 때문에?

DML 트리거는 사용자가 데이터 조작 언어 (DML) 이벤트를 통해 데이터를 수정하려고 할 때 실행됩니다. DML 이벤트는 테이블 또는 뷰에 대한 INSERT, UPDATE 또는 DELETE 문입니다. 이러한 트리거는 테이블 행이 영향을 받는지 여부와 관계없이 유효한 이벤트가 발생하면 실행됩니다 ().

(내 강조)

은 아마 거의 의미가 있지만, 어쩌면 더 많은 시간과에 대한 개발 노력을 요할 것이 밝혀 때 트리거를 억제하는 특수 코드 경로를 만들 마이크로 소프트 영향을받는 행이 없습니다.

deleted을 잠재적으로 0, 1 또는 여러 행을 포함하도록 처리하도록 신중하게 트리거를 설계해야하는 또 다른 예입니다.


테이블과 연관된 이벤트 등이 발생할 때마다 SQL 트리거 실행 또는 소성

+0

나는이 질문을 볼 수있는 많은 (더) 눈 앞에 내 대답 중 하나 뻔뻔스러운 실수를 해결하기 위해 시간에 답을 발견했습니다. :) 감사! –

+0

내 질문은 왜 이런 식으로 결정했는지에 관한 질문이었습니다. 나는 개발 시간을 절약하는 것보다 아마 다른 이유를 찾고 있었다. 그러나 나는 어떤 것도 찾을 수 없다. 그것은 매우 직관력이없고 트리거를 좀 더 복잡하게 만든다. 그러나 어쨌든 고마워. – kwitee

0

(또한, 관계형 관점에서, 튜플을 포함하지 않는 집합들이 여전히 항상 흥미로울 수) 삽입, 갱신 또는 삭제할 수 있으며 select 문에는 적용되지 않습니다. 트리거를 다시 실행하여 테이블이 업데이트되거나 삽입 또는 삭제되는지 확인하십시오.

감사합니다, sa.va3feb

관련 문제