1

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,他的评论使我得到了这个启示。

4

0 回答 0