有没有办法找到所有已被单个语句更新的行,sql本身必须跟踪它,因为它可以在需要时回滚更新。我有兴趣找到所有已更改的行,因为我使用更新触发器来获得性能。
我在Sql Server中有一些大的(2M-10M)行表,我正在添加审计触发器来跟踪记录何时更新以及什么,麻烦是这会导致性能下降。针对该表的大多数更新将触及20,000多行,并且它们现在比以前长5到10倍。
我想到了一些选择
1)Ditch完全触发并将审计字段添加到每个更新语句,但这依赖于每个人的代码被更改。 2)在字段上使用校验和值之前/之后,然后使用它们再次更新已更改的行,仍然会影响性能。
还有其他人解决了这个问题吗?
答案 0 :(得分:2)
SqlServer知道如何回滚,因为它有事务日志。不是您可以在数据表中找到的东西。
您可以尝试向行添加时间戳列,然后保存“当前”时间戳,更新所有行。更改的行应该是时间戳大于“当前”时间戳的所有行。这将帮助您找到更改的行,但不能找到更改它们的内容。
答案 1 :(得分:2)
UPDATE触发器已经在插入和删除的伪列中具有受更新语句影响的记录。您可以将其主键列选择为用作队列的初步审计表,并将更复杂的计算移动到单独的作业中。
另一个选项是UPDATE语句的OUTPUT子句,它是在SQL Server 2005中引入的。(在Philip Kelley评论后更新)
答案 2 :(得分:1)
您可以使用Change Tracking或Change Data Capture。这些是Engine内置的技术,用于跟踪更改并利用复制基础结构(日志读取器或表触发器)。两者仅在SQL Server 2008或2008 R2中可用,而CDC需要Enterprise Edition许可。
你要做的其他事情最终归结为以下任何一个:
没有任何免费午餐。如果需要审计,则必须考虑审计的开销,并且必须相应地进行容量规划。所有数据审计解决方案都会导致显着开销,因此运营成本增加2倍,4倍甚至10倍并非闻所未闻。