首页 > 解决方案 > 创建 INSTEAD OF UPDATE 触发器以更新 3 个表中的 HasChanged 字段

问题描述

我创建了一个转换视图,它使用来自两个不同表的值更新主表。

进行此更新时,我需要更改受影响记录的所有表中的“HasChanged”值。

例如:主表中的一行更新为一张表中的道路名称和另一张表中的城市名称。包含新道路名称和城市名称的 2 个表中的行必须将其 HasChanged 值更新为 0(从 1 开始),以及主表。

为此,我需要创建一个触发器。到目前为止,这就是我所拥有的:

CREATE TRIGGER [Transform].[trItems_HasChanged] ON [Transform].[vItems_HasChanged]
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON

        CREATE TABLE #inserted
        (
                             Id BIGINT
        )
        CREATE TABLE #PostnummerBy
        (
                             Postnr BIGINT
        )
        CREATE TABLE #Vejstykke
        (
                             Id BIGINT
        )

        INSERT INTO #Inserted (Infohub_Id)
        SELECT Id FROM inserted

        CREATE NONCLUSTERED INDEX ixInserted_Infohub_Id ON #Inserted (Infohub_Id)

                UPDATE 
                             InfohubStaging.Perfion.tMirror_Items 
                SET 
                             Infohub_HasChanged = 0
                FROM
                             InfohubStaging.Perfion.tMirror_Items 
                             JOIN #Inserted i ON i.Infohub_Id = InfohubStaging.Perfion.tMirror_Items.Infohub_Id
                WHERE 
                             Infohub_HasChanged = 1

                UPDATE 
                             InfohubStaging.Nav.tMirror_PimItem 
                SET 
                             Infohub_HasChanged = 0
                FROM
                             InfohubStaging.Nav.tMirror_PimItem 
                             JOIN #Inserted i ON i.Infohub_Id = InfohubStaging.Nav.tMirror_PimItem.InfohubId
                WHERE 
                             Infohub_HasChanged = 1

                UPDATE 
                             InfohubStaging.Ax.tMirror_Items_LiveUpdates  
                SET 
                             Infohub_HasChanged = 0
                FROM
                             InfohubStaging.Ax.tMirror_Items_LiveUpdates 
                             JOIN #Inserted i ON i.Infohub_Id = InfohubStaging.Ax.tMirror_Items_LiveUpdates.Infohub_Id
                WHERE 
                             Infohub_HasChanged = 1

    END

我不确定如何正确处理这个问题。我知道在执行更新触发器(之前和之后的数据)时会创建 2 个临时表。由于临时表是不可索引的,我需要为它们创建索引。所以我需要创建 3 个表,每个表一个需要更新其 HasChanged 值。

我的预期输出在 Vejstykke、PostnummerBy 和 Master 表中更新了 HasChanged 值。

标签: sqlsql-servertriggerssql-update

解决方案


推荐阅读