집 >데이터 베이스 >MySQL 튜토리얼 >SQL Server 복제에서 업데이트된 필드만 효율적으로 검색하는 방법은 무엇입니까?
소개
SQL Server 데이터베이스 간에 데이터를 복제할 때 다음이 필요합니다. 수정된 필드를 식별합니다. 기본 메커니즘인 COLUMNS_UPDATED는 업데이트된 필드를 비트 단위로 표현합니다. 그러나 이 문서에서는 업데이트된 열 값만 포함된 XML 조각을 검색하는 대체 접근 방식을 제시합니다.
사용자 정의 업데이트 트리거 함수
이를 달성하려면 사용자 정의 업데이트 트리거 기능은 다음과 같습니다.
CREATE TRIGGER DBCustomers_Insert ON DBCustomers AFTER UPDATE AS BEGIN DECLARE @sql as NVARCHAR(1024); SET @sql = 'SELECT '; WITH UpdatedColumns AS ( SELECT c.name AS ColumnName FROM sys.columns AS c JOIN inserted AS i ON c.object_id = i.object_id WHERE c.is_identity = 0 AND i.Original_value <> i.value ) SELECT @sql = @sql + ',' + ColumnName FROM UpdatedColumns SET @sql = $sql + ' FROM inserted FOR XML RAW'; DECLARE @x as XML; SET @x = CAST(EXEC(@sql) AS XML); .. use @x END
업데이트가 없는 대체 솔루션 COLUMNS_UPDATED
COLUMNS_UPDATED 대신 삽입 및 삭제된 테이블을 피벗 해제하고 조인하고 변경 사항을 필터링하는 다른 접근 방식이 있습니다.
CREATE TRIGGER TriggerName ON dbo.Sample_Table FOR DELETE, INSERT, UPDATE AS BEGIN SET NOCOUNT ON; WITH deleted_unpvt AS ( SELECT ContactID, FieldName, FieldValue FROM (SELECT ContactID , cast(Forename as sql_variant) Forename , cast(Surname as sql_variant) Surname , cast(Extn as sql_variant) Extn , cast(Email as sql_variant) Email , cast(Age as sql_variant) Age FROM deleted) p UNPIVOT (FieldValue FOR FieldName IN (Forename, Surname, Extn, Email, Age) ) AS deleted_unpvt ), inserted_unpvt AS ( SELECT ContactID, FieldName, FieldValue FROM (SELECT ContactID , cast(Forename as sql_variant) Forename , cast(Surname as sql_variant) Surname , cast(Extn as sql_variant) Extn , cast(Email as sql_variant) Email , cast(Age as sql_variant) Age FROM inserted) p UNPIVOT (FieldValue FOR FieldName IN (Forename, Surname, Extn, Email, Age) ) AS inserted_unpvt ) INSERT INTO Sample_Table_Changes (ContactID, FieldName, FieldValueWas, FieldValueIs) SELECT Coalesce (D.ContactID, I.ContactID) ContactID , Coalesce (D.FieldName, I.FieldName) FieldName , D.FieldValue as FieldValueWas , I.FieldValue AS FieldValueIs FROM deleted_unpvt d FULL OUTER JOIN inserted_unpvt i on D.ContactID = I.ContactID AND D.FieldName = I.FieldName WHERE D.FieldValue <> I.FieldValue --Changes OR (D.FieldValue IS NOT NULL AND I.FieldValue IS NULL) -- Deletions OR (D.FieldValue IS NULL AND I.FieldValue IS NOT NULL) -- Insertions END
위 내용은 SQL Server 복제에서 업데이트된 필드만 효율적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!