有没有一种方法可以找到由一条语句更新的所有行,sql本身必须跟踪这一点,因为如果需要,它可以回滚更新。我对查找所有更改的行很感兴趣,因为我使用update触发器获得了性能影响。
我在Sql Server中有一些很大(2M-10M)的行表,我添加了审计触发器来跟踪记录更新的时间和时间,问题是这会扼杀性能。大多数针对表的更新都会涉及到20,000+行,它们现在花费的时间是以前的5-10倍。
我已经想到了一些选择
1)完全抛弃触发器,并将审计字段添加到每个update语句中,但这依赖于每个人的代码被更改。2)在字段上使用之前/之后的校验和值,然后使用它们来第二次更新更改的行,这仍然会影响性能。
还有没有人解决了这个问题?
发布于 2010-07-08 01:47:56
UPDATE触发器已在inserted和deleted伪列中具有受update语句影响的记录。您可以将它们的主键列选择到用作队列的初步审核表中,然后将更复杂的计算移动到单独的作业中。
另一个选项是UPDATE语句的OUTPUT子句,它是在SQL Server2005中引入的。( Philip Kelley发表评论后更新)
发布于 2010-07-07 20:16:08
SqlServer知道如何回滚,因为它有事务日志。不是你可以在数据表中找到的东西。
您可以尝试将时间戳列添加到行中,然后保存“当前”时间戳,更新所有行。更改的行应该是时间戳大于“当前”时间戳的所有行。THis将帮助您查找更改的行,但不会帮助您查找是什么更改了它们。
发布于 2010-07-08 02:08:42
您可以使用Change Tracking或Change Data Capture。这些技术内置于引擎中,用于跟踪更改,并利用复制基础结构(日志读取器或表触发器)。这两者仅在SQL Server2008或2008CDC中可用,而R2需要企业版许可。
你尝试做的任何其他事情最终都会归结为以下两种之一:
中的更改
就是没有免费的午餐。如果需要审计,则必须考虑审计的开销,并且必须相应地进行容量规划。所有的数据审计解决方案都会引入大量的管理费用,因此运营成本增加2倍、4倍甚至10倍并不是闻所未闻的。
https://stackoverflow.com/questions/3194496
复制相似问题