시스템에서 외부 시스템으로 데이터를 동기화 해야하는 프로젝트를 진행 중입니다. 내가 달성하고 싶은 것은 정기적으로 변경된 항목 (행) 만 사용자 정의 쿼리에서 보내는 것입니다. 이 쿼리는 다음과 같지만 더 많은 열이 있습니다.
SELECT T1.field1,
T1.field2,
T1.field2,
T1.field3,
CASE WHEN T1.field4 = 'some-value' THEN 1 ELSE 0 END,
T2.field1,
T3.field1,
T4.field1
FROM T1
INNER JOIN T2 ON T2.pk = T2.fk
INNER JOIN T3 ON T3.pk = T2.fk
INNER JOIN T4 ON T4.pk = T2.fk
동기화 사이의 모든 필드를 하나로 비교하지 않아도됩니다. 나는 쿼리에서 모든 행에 해시를 생성 할 수 있다는 아이디어를 가지고 있었고,이를 이전 동기화에서 해시와 비교하여 변경된 행만 반환합니다. 나는 알고있다 체크섬 기능이지만 매우 충돌하기 쉬우 며 때로는 변화를 놓칠 수 있습니다. 하지만 난 그냥 임시 테이블을 만들고 사용할 수있는 방법이 마음에 듭니다. CHECKSUM(*)
, 유지 보수가 더 쉬워집니다 (쿼리와 체크섬에 필드를 추가 할 필요가 없습니다) :
SELECT T1.field1,
T1.field2,
T1.field2,
T1.field3,
CASE WHEN T1.field4 = 'some-value' THEN 1 ELSE 0 END,
T2.field1,
T3.field1,
T4.field1
INTO #tmp
FROM T1
INNER JOIN T2 ON T2.pk = T2.fk
INNER JOIN T3 ON T3.pk = T2.fk
INNER JOIN T4 ON T4.pk = T2.fk;
-- get all columns from the query, plus a hash of the row
SELECT *, CHECKSUM(*)
FROM #tmp;
나는 알고있어 해시 테스 함수 (SHA1, MD5를 지원하는 경우 충돌이 적은 경향이 없음) 그러나 열 목록이나 체크섬의 방식이 아닌 Varchar 또는 Varbinary 만 허용합니다. 쿼리에서 모든 열을 캐스팅/변환하는 것은 통증입니다.
나는 또한 알아 차렸다 데이터 캡처 변경 및 변경 추적 SQL Server의 기능이지만 모두 내가하고있는 일에 대해 복잡하고 과잉으로 보입니다.
그래서 내 질문 : 쿼리에서 해시를 생성하는 다른 방법이 있습니까? 또는 내 기준을 충족하는 임시 테이블이 있습니까?
그렇지 않다면, 이런 종류의 작업을 달성하는 다른 방법이 있습니까 (쿼리와의 차이를 동기화하기 위해)