sql - 创建 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 值。
解决方案
推荐阅读
- socket.io - engine.io [RangeError: 超出最大调用堆栈大小]
- ios - iOS:来自 iOS14 EXC_BAD_ACCESS 线程队列的随机错误消息:NSManagedObjectContext NSInternalAdditions forgetObject multiplyToObjectStore
- javascript - 如何以与在 Javascript 中相同的方式在 Typescript 中访问“this”?
- javascript - Javascript 表单动作更改事件
- java - 如何在 android 中创建类似于附件的可折叠编辑文本区域
- reactjs - React Js 错误“当我安装 react js 时,它会显示一个错误”
- laravel - 无法在 vue cli 项目中使用 laravel-echo
- python - 在 matplotlib 中绘制对数正态比例
- javascript - 如果在内部单击,OnBlur 关闭反应组件
- cordova - Xcode 12 和 iOS 14 出现奇怪问题,Coresimulator 错误等