2010-01-18 2 views
2

데이터베이스의 뷰에 INSTEAD OF INSERT 트리거를 만들었습니다. 보기에서 INSERT 문의 열 목록에 포함 된 열을 알고 싶습니다.INSERT TRIGGERS 및 UPDATE() 함수

트리거에 대한 MSDN 설명서를 읽으면 UPDATE() 및 COLUMNS_UPDATED() 함수가이 요구 사항을 충족해야합니다. 그러나, 내 테스트 중에 INSERT 열 목록에 어떤 열이 관계없이 UPDATE() 및 COLUMNS_UPDATED() 함수는 항상보기에서 모든 열을 반환하는 것을 발견했습니다.

내가 이것을하고 싶은 이유는 기존 테이블을 수정해야하고 거기에 의존하는 많은 레거시 코드가 있기 때문입니다. 그래서 내가 한 것은 새로운 테이블을 생성하고, 이전의 테이블을 뷰로 변경하고 뷰에 트리거를 생성하여 INSERT, UPDATE 및 DELETE 문을 허용합니다.

보기에 삽입하면 기본값을 사용하는 경우 기존 테이블에 특정 열에 대한 기본값이 있습니다. 새 테이블에 삽입 할 때 기본값을 사용하고 싶습니다. 이렇게하려면 INSERT에 대해 [명시 적으로] 제공된 열이있는 열을 파악할 수 있어야합니다.

열이 NULL인지 확인하려면 INSERT 문에서 필드 값을 NULL로 명시 적으로 설정할 수 있고 이것이 허용 될 수 있기 때문에 충분하지 않습니다.

음, 분명하겠습니다. Kep.

답변

4

INSERT 문에서 모든 열이 영향을받습니다. 그것은 NULL 또는 지정한 값을 가져옵니다.

NULL을 확인하는 것이 가장 좋은 방법이지만, 그렇게 할 수는 없으므로 조금 혼란 스러울 수도 있습니다. 명시 적으로 NULL을 처리해야 할 수도있는 시나리오를 해결할 수 있습니까?

+0

뭔가를 정렬 할 수 있습니다. 어쩌면 가장 일반적인 시나리오로 가서 처리 할 수없는 레거시 코드를 수정 해 보겠습니다. – Kepboy

2

INSERT의 경우 모든 것이 새로운 행이므로 변경됩니다.

AFTER 트리거가있는 경우 삽입 된 값이 기본값인지 테스트 할 수 있습니다. 기본값이 NULL이면 (예 : null 허용 및 기본값 없음), 어떤 트리거에 NULL이 명시 적으로 삽입되었는지 구별 할 수 있습니까?

BEFORE 트리거에서 기본값을 트랩 할 수 있는지 여부를 알 수 없습니다. 물론 기본값이 NEWID() 인 경우에도 여전히 도움이되지 않습니다.

얼굴에는 트리거로 수행 할 수 없습니다.

관련 문제