Heim >Datenbank >MySQL-Tutorial >Wie kann ich nur aktualisierte Felder in der SQL Server-Replikation effizient abrufen?

Wie kann ich nur aktualisierte Felder in der SQL Server-Replikation effizient abrufen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-03 12:52:39961Durchsuche

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

Aktualisierte Felder für die Replikation in SQL Server erhalten

Einführung

Beim Replizieren von Daten zwischen SQL Server-Datenbanken ist es notwendig Identifizieren Sie die Felder, die geändert wurden. Der Standardmechanismus COLUMNS_UPDATED stellt eine bitweise Darstellung aktualisierter Felder bereit. Dieser Artikel stellt jedoch einen alternativen Ansatz zum Abrufen eines XML-Snippets vor, das nur die aktualisierten Spaltenwerte enthält.

Benutzerdefinierte Update-Triggerfunktion

Um dies zu erreichen, erstellen Sie eine benutzerdefinierte Aktualisieren Sie die Triggerfunktion wie folgt:

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

Alternative Lösung ohne COLUMNS_UPDATED

Anstelle von COLUMNS_UPDATED besteht ein anderer Ansatz darin, die eingefügten und gelöschten Tabellen zu entpivotieren, sie zu verbinden und nach Änderungen zu filtern:

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

Das obige ist der detaillierte Inhalt vonWie kann ich nur aktualisierte Felder in der SQL Server-Replikation effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn