ホームページ >データベース >mysql チュートリアル >SQL Server レプリケーションで更新されたフィールドのみを効率的に取得する方法

SQL Server レプリケーションで更新されたフィールドのみを効率的に取得する方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-03 12:52:39998ブラウズ

How to Efficiently Retrieve Only Updated Fields in SQL Server Replication?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。