Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更新时的SQL Server触发器将整个表插入历史记录_Sql Server_Triggers_Onupdate - Fatal编程技术网

Sql server 更新时的SQL Server触发器将整个表插入历史记录

Sql server 更新时的SQL Server触发器将整个表插入历史记录,sql-server,triggers,onupdate,Sql Server,Triggers,Onupdate,Gotcha alert re需要帮助调整更新触发器以遵守where子句 SQL Server 2008。例如,主表有12345行。我的目的是,在更新时,我只想在更新完成时将正在更新的记录复制到历史记录表中。在使用where子句进行更新时,我发现触发器正在传输整个表,而不仅仅是受where子句限制的记录 生产中的历史记录表与开发中的数据结构不同,因此我从Select复制/粘贴了Prod结构。我不是SQL Server专家,我没有注意到我的Dev触发器中的insert遗漏了,并在Prod上的触发器

Gotcha alert re需要帮助调整更新触发器以遵守where子句

SQL Server 2008。例如,主表有12345行。我的目的是,在更新时,我只想在更新完成时将正在更新的记录复制到历史记录表中。在使用where子句进行更新时,我发现触发器正在传输整个表,而不仅仅是受where子句限制的记录

生产中的历史记录表与开发中的数据结构不同,因此我从Select复制/粘贴了Prod结构。我不是SQL Server专家,我没有注意到我的Dev触发器中的insert遗漏了
,并在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
在消息中,我得到了两个响应:

(12345 rows affected)
(5 rows affected)
在历史记录表的前后运行count(*)显示所有12345行都已插入到
myTable\u LogUpdate
表中(该表现在非常庞大,急需清理)

更新:由于驱动器的磁盘空间不足,我不得不删除原始的Prod触发器。我原来帖子中的触发器代码来自Dev,因此它显示的是正确的代码,而不是我在Prod上运行的实际问题触发器代码。任何so专家都无法回答我遇到的问题,因为OP不是bug

我已经更新了OP以反映问题代码是什么,并在需要更正的地方添加了注释。我重新创建了历史记录表,将触发器固定为插入的
,现在可以正常工作了


感谢Sean,他的评论让我了解了这一点。

我猜您在这张表上一定有不止一个更新触发器?你能分享另一个触发器吗?不。这是唯一的触发器。
(受影响的5行)
是我在主表中尝试执行的实际更新的DB响应消息。
(受影响的12345行)
是将主表的所有现有行传输到历史记录表的事务的DB响应消息。如果只有一个触发器,设置触发器顺序的意义是什么?在信息中,接收信息的顺序很重要。第一个是update语句,第二个是触发器。有些事情不能肯定是对的,但不可能说出来。如果你能共享你的表结构和一个有效的触发器,以及能够重现这个的数据,我们可以提供帮助。我只是摇动它,直到它似乎起作用。那么你是说既然只有一个触发器我可以/应该删除,
@order=N'Last',
?OP中响应的顺序是DB返回的顺序。触发器是在更新行之前捕获要更新的行,这就是它首先出现的原因。(感谢marc_s的清理!)不确定您最后的评论是什么意思,但插入的虚拟表包含所有更新的行。插入的表包含新值,删除的表包含旧值。从您上次的评论中,我认为您希望查看已删除的表,而不是插入的表。:)我猜这个表上一定有不止一个更新触发器?你能分享另一个触发器吗?不。这是唯一的触发器。
(受影响的5行)
是我在主表中尝试执行的实际更新的DB响应消息。
(受影响的12345行)
是将主表的所有现有行传输到历史记录表的事务的DB响应消息。如果只有一个触发器,设置触发器顺序的意义是什么?在信息中,接收信息的顺序很重要。第一个是update语句,第二个是触发器。有些事情不能肯定是对的,但不可能说出来。如果你能共享你的表结构和一个有效的触发器,以及能够重现这个的数据,我们可以提供帮助。我只是摇动它,直到它似乎起作用。那么你是说既然只有一个触发器我可以/应该删除,@order=N'Last',?OP中响应的顺序是DB返回的顺序。触发器是在更新行之前捕获要更新的行,这就是它首先出现的原因。(感谢marc_s的清理!)不确定您最后的评论是什么意思,但插入的虚拟表包含所有更新的行。插入的表包含新值,删除的表包含旧值。从您上次的评论中,我认为您希望查看已删除的表,而不是插入的表。:)
(12345 rows affected)
(5 rows affected)