2013-06-24 1 views
0

나는 SQL Server의 두 개의 테이블이 있습니다테이블의 모든 필드를 포함하도록이 트리거를 어떻게 변경할 수 있습니까?

  • 사람을
  • PersonHistory

매번 누군가가 내가이 트리거를 실행 Person 테이블이 PersonHistory 테이블에 레코드를 저장하기 위해 업데이트 :

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [TU_Person] 
ON [Person] 
AFTER UPDATE 
AS 
SET NOCOUNT ON 

INSERT 
INTO [PersonHistory] 
     ([Field1], [Field2],[Field3],[Field4],[Field5],[Field6], [LastUpdated], [LastUpdatedBy]) 
SELECT [Field1], [Field2],[Field3],[Field4],[Field5],[Field6], [LastUpdated], [LastUpdatedBy] 
FROM deleted 

문제는 계속이 테이블에 필드를 추가하고이 트리에 필드를 추가하는 것을 잊어 버리는 것입니다 거거. 이 트리거를 다시 작성하여 모든 필드 이름을 하나씩 나열하는 대신 insert *Select *이라고 간단하게 다시 쓸 수 있습니까? 삭제

열이

추가 필드가 선택 기품을 변경함으로써 시작이나 끝에 추가 될 수있는 동일한 순서 인 경우이 작동 FROM SELECT * PersonHistory] INTO

답변

1

INSERT 예를 들어, 날짜 필드를 포함 :

INSERT 
INTO [PersonHistory] 
SELECT *, getdate() FROM deleted 

여기에 더 큰, 더 위험한 위험은 업데이트가 하나 개의 테이블이 아닌 다른 잠재적 원인이 t에 할 것입니다 오류에 대한 그의 방아쇠. 이것은 라이브 환경에서 누락 된 필드보다 큰 악이 될 것입니다 - 제 의견으로는.

1
INSERT 
INTO [PersonHistory] 
SELECT 
* 
FROM 
deleted 
WHERE 
inserted.[Common_Field]=deleted.[Common_Field] 

그러나 항상 필드 이름을 명시 적으로 언급하는 것이 좋습니다.

관련 문제