ホームページ >データベース >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 中国語 Web サイトの他の関連記事を参照してください。