2012-09-05 3 views
3

SQL Server에서 행이 변경되었는지 여부를 감지하는 트리거를 만들려고합니다. 내 현재 접근 방식은 각 필드를 반복하고, COLUMNS_UPDATED()를 적용하여 UPDATE가 호출되었는지 여부를 확인한 다음, 삭제 된 삽입 된 행에서 (PK로 식별 된) 동일한 행에 대해이 필드의 값을 비교합니다.SQL Server : 변경된 행을 검색하는 방법

절차에서 반복을 제거하고 싶습니다. 아마도 삽입되고 삭제 된 내용을 하나의 테이블, 모든 컬럼의 그룹으로 덤프하고 count = 2의 행을 선택할 수 있습니다. 해당 행은 변경되지 않은 것으로 계산됩니다.

최종 목표는 감사 내역 생성하는 것이다 : 1) 트랙 사용자 소인 2) 트랙을 삽입 삭제 REAL은 어떤 제안이 이해된다

바꾼다.

+0

는 트리거 상황이 있습니까? – StuartLC

+0

예. SQL Server에 내장 된 솔루션을 살펴 보았습니다. 모든 요구 사항을 충족하지 못합니다. –

+1

가능한 복제본 [일반 SQL Server 저장 프로 시저를 삽입 및 삭제 된 트리거를 기반으로 감사 테이블에 삽입하는 방법] (http://stackoverflow.com/questions/8873335/how-to-create-generic-sql- 서버 저장 프로 시저 - 수행 - 삽입 - 감사) – GSerg

답변

4

반복 대신 삽입 된 테이블과 삭제 된 테이블 사이의 전체 행을 비교하려면 BINARY_CHECKSUM을 사용하고 그에 따라 작동 할 수 있습니다.

Create table SomeTable(id int, value varchar(100)) 

Create table SomeAudit(id int, Oldvalue varchar(100), NewValue varchar(100)) 


Create trigger tr_SomTrigger on SomeTable for Update 
as 
begin 
     insert into SomeAudit 
     (Id, OldValue, NewValue) 
     select i.Id, d.Value, i.Value 
     from 
     (
      Select Id, Value, Binary_CheckSum(*) Version from Inserted 
     ) i 
     inner join 
     (
      Select Id, Value, Binary_CheckSum(*) Version from Deleted 
     ) d 
     on i.Id = d.Id and i.Version <> d.Version 


End 

Insert into sometable values (1, 'this') 
Update SomeTable set Value = 'That' 
Select * from SomeAudit 
+0

WHERE 절에서이 함수를 어떻게 사용할 수 있는지 알고 계십니까? 나는 다음과 같은 것을 가지고있다 : \t \t where BINARY_CHECKSUM (i. *) <> BINARY_CHECKSUM (d. *) –

+0

where 절에서 그것을 사용하려면 부속 질의에 포함시킨 다음 where 절을 사용하는 것이 좋습니다. 하위 쿼리에 대해 샘플을 추가했습니다. – cmsjr

+0

참고 : 일부 유형의 열은 BINARY_CHECKSUM() 비교에서 제외됩니다. MS doco에서 "BINARY_CHECKSUM은 비 호환 데이터 형식의 열을 계산에서 무시합니다. 비 호환 데이터 형식에는 text, ntext, image, cursor, xml, .."이 포함됩니다. –

관련 문제