Gotcha alert re 需要帮助调整更新触发器以遵守 where 子句。
SQL Server 2008。主表有 12345 行。我的意图是,在更新时,我只想在更新完成时将正在更新的记录复制到历史表中。在使用 where 子句进行更新时,我发现触发器正在传输整个表,而不仅仅是受 where 子句限制的记录。
Production 中的 History 表与 Development 的数据结构不同,因此我从 Select 中复制/粘贴了 Prod 结构。不是 SQL Server 专家,我没有注意到我错过from insert
了 Dev 触发器,并在 Prod 的触发器中留下了 Select 中的实际表名:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE trigger [dbo].[myTable_LogUpdate]
ON [dbo].[myTable]
FOR UPDATE
AS
INSERT INTO myTable_Hist ([ID], [FLD_1], ..., [FLD_N], [HIST_DT])
SELECT
[ID], [FLD_1], ..., [FLD_N], GETDATE() AS HIST_DT
FROM
[dbo].[myTable] -- <<< this should be FROM inserted
GO
EXEC sp_settriggerorder @triggername=N'[dbo].[myTable_LogUpdate]', @order=N'Last', @stmttype=N'UPDATE'
GO
当我使用 where 子句运行更新以更新 5 条记录时:
USE [myDb]
update myTable
set FLD_7 = 2
where FLD_1 = 10 and FLD_2 = 20
在消息中,我得到 2 个回复:
(12345 rows affected)
(5 rows affected)
并在历史表之前和之后运行 count(*) 显示所有 12345 行都已插入到myTable_LogUpdate
表中(现在非常庞大,迫切需要清理)。
更新:我不得不删除原来的 Prod 触发器,因为驱动器的磁盘空间不足。我原来帖子中的触发代码来自 Dev,所以它显示的是正确的代码,而不是我在 Prod 上运行的实际有问题的触发代码。任何 SO 大师都无法回答我遇到的问题,因为 OP 不是错误。
我已经更新了 OP 以反映问题代码是什么,并附上了需要更正的符号。我已经重新创建了历史表,将触发器修复为from inserted
现在可以正常工作。
感谢 Sean,他的评论使我得到了这个启示。