ホームページ > データベース > mysql チュートリアル > SQL Server 更新トリガーから変更されたフィールドのみを効率的に取得する方法

SQL Server 更新トリガーから変更されたフィールドのみを効率的に取得する方法

Barbara Streisand
リリース: 2024-12-21 16:40:15
オリジナル
194 人が閲覧しました

How to Efficiently Retrieve Only Modified Fields from an SQL Server Update Trigger?

SQL Server 更新トリガーの変更されたフィールドのみの取得

概要

このシナリオでは、変更された列のみを含む XML を取得することを目的としています。 SQL Server データベースで更新トリガーを実行するときの値。この情報は、データ レプリケーションの目的にとって非常に重要です。

アプローチ

オプション 1: 動的 SQL の利用 (宣言的アプローチ)

1 つの方法では、動的 SQL を使用して抽出するコードを構築します。変更された列の値。ただし、テーブルに多数の列がある場合、このアプローチは面倒になる可能性があります。

オプション 2: アンピボットと結合 (非宣言的アプローチ)

より効率的な解決策は、両方のピボットをアンピボットすることです。テーブルを挿入および削除し、一意のキー (ContactID)、フィールド名 (FieldName)、およびフィールド値 (FieldValue) のフィールドを含むテーブルを作成します。これら 2 つのテーブルを結合することで、FieldValue が変更された行を識別し、変更された値を得ることができます。

次のコードを考えてみましょう:

CREATE TRIGGER TriggerName ON dbo.Sample_Table FOR DELETE, INSERT, UPDATE AS
BEGIN
    SET NOCOUNT ON;

    -- Unpivot deleted
    WITH deleted_unpvt AS (
        SELECT ContactID, FieldName, FieldValue
        FROM (SELECT ContactID, Forename, Surname, Extn, Email, Age FROM deleted) p
        UNPIVOT (FieldValue FOR FieldName IN (Forename, Surname, Extn, Email, Age)) AS deleted_unpvt
    ),
    -- Unpivot inserted
    inserted_unpvt AS (
        SELECT ContactID, FieldName, FieldValue
        FROM (SELECT ContactID, Forename, Surname, Extn, Email, Age FROM inserted) p
        UNPIVOT (FieldValue FOR FieldName IN (Forename, Surname, Extn, Email, Age)) AS inserted_unpvt
    )

    -- Join them and identify changes
    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
    OR (D.FieldValue IS NOT NULL AND I.FieldValue IS NULL)
    OR (D.FieldValue IS NULL AND I.FieldValue IS NOT NULL);
    
    -- Use the contents of Sample_Table_Changes for replication
END
GO
ログイン後にコピー

この非宣言的なアプローチは、複雑な動的 SQL を使用したり、ビットフィールド算術オーバーフローの問題に直面したりすることなく、変更、削除、挿入を効果的に処理します。また、追加の GUID 列が識別に使用されている限り、自然主キーの変更の影響を受けません。

以上がSQL Server 更新トリガーから変更されたフィールドのみを効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート