SQL Server触发器—一个失败,一个不失败';T
我们有一个触发器,它是为一组大约40个表动态生成的。如果触发器位于表SQL Server触发器—一个失败,一个不失败';T,sql,sql-server,triggers,Sql,Sql Server,Triggers,我们有一个触发器,它是为一组大约40个表动态生成的。如果触发器位于表A上,则它会以两种方式修改表B: 在表B 在表B 这两个表之间有一个链接,使得abID是Bid的外键 本周我们发现至少有一个表的触发器没有执行步骤2(我们不确定它是否执行步骤1)。但它似乎在其他大多数桌子上都起作用 一时兴起,我们的一位开发人员将触发器更改为“更高效”。但随后问题似乎消失了 我们不太清楚这两个触发器之间有什么不同,有什么见解吗 触发器损坏: 工作触发器: [B]中是否有[id]的空值?如果是,则不在中将无法正常
A
上,则它会以两种方式修改表B
:
B
B
a
bID
是B
id
的外键
本周我们发现至少有一个表的触发器没有执行步骤2(我们不确定它是否执行步骤1)。但它似乎在其他大多数桌子上都起作用
一时兴起,我们的一位开发人员将触发器更改为“更高效”。但随后问题似乎消失了 我们不太清楚这两个触发器之间有什么不同,有什么见解吗 触发器损坏: 工作触发器:
[B]中是否有[id]的空值?如果是,则
不在
中将无法正常工作。您需要更新到以下内容:
INSERT INTO [B] ([id], [timeDirty])
SELECT DISTINCT [bID], GETUTCDATE() FROM inserted
WHERE [bID] NOT IN (SELECT [id] FROM [B] WHERE [id] IS NOT NULL)
第一个查询使用
[B].id
,第二个查询使用[B].guid
进行加入。是印刷错误吗?对不起,那是印刷错误。我已经在问题中更正了它,[id]字段不可为空,因此不存在空值。
CREATE TRIGGER [A_Dirty] ON [A] AFTER INSERT, UPDATE, DELETE
BEGIN
SET NOCOUNT ON;
UPDATE [B] SET [timeDirty] = GETUTCDATE() FROM inserted WHERE [id] = [bID];
UPDATE [B] SET [timeDirty] = GETUTCDATE() FROM deleted WHERE [id] = [bID];
INSERT INTO [B] ([id], [timeDirty])
SELECT DISTINCT [bID], GETUTCDATE()
FROM inserted
LEFT OUTER JOIN [B]
ON [B].[id] = inserted.[bID]
WHERE [B].[id] IS NULL
END
INSERT INTO [B] ([id], [timeDirty])
SELECT DISTINCT [bID], GETUTCDATE() FROM inserted
WHERE [bID] NOT IN (SELECT [id] FROM [B] WHERE [id] IS NOT NULL)