首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql Server,则查找已由语句更新的所有行

Sql Server,则查找已由语句更新的所有行
EN

Stack Overflow用户
提问于 2010-07-07 20:09:30
回答 3查看 4.2K关注 0票数 1

有没有一种方法可以找到由一条语句更新的所有行,sql本身必须跟踪这一点,因为如果需要,它可以回滚更新。我对查找所有更改的行很感兴趣,因为我使用update触发器获得了性能影响。

我在Sql Server中有一些很大(2M-10M)的行表,我添加了审计触发器来跟踪记录更新的时间和时间,问题是这会扼杀性能。大多数针对表的更新都会涉及到20,000+行,它们现在花费的时间是以前的5-10倍。

我已经想到了一些选择

1)完全抛弃触发器,并将审计字段添加到每个update语句中,但这依赖于每个人的代码被更改。2)在字段上使用之前/之后的校验和值,然后使用它们来第二次更新更改的行,这仍然会影响性能。

还有没有人解决了这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-08 01:47:56

UPDATE触发器已在inserted和deleted伪列中具有受update语句影响的记录。您可以将它们的主键列选择到用作队列的初步审核表中,然后将更复杂的计算移动到单独的作业中。

另一个选项是UPDATE语句的OUTPUT子句,它是在SQL Server2005中引入的。( Philip Kelley发表评论后更新)

票数 3
EN

Stack Overflow用户

发布于 2010-07-07 20:16:08

SqlServer知道如何回滚,因为它有事务日志。不是你可以在数据表中找到的东西。

您可以尝试将时间戳列添加到行中,然后保存“当前”时间戳,更新所有行。更改的行应该是时间戳大于“当前”时间戳的所有行。THis将帮助您查找更改的行,但不会帮助您查找是什么更改了它们。

票数 2
EN

Stack Overflow用户

发布于 2010-07-08 02:08:42

您可以使用Change TrackingChange Data Capture。这些技术内置于引擎中,用于跟踪更改,并利用复制基础结构(日志读取器或表触发器)。这两者仅在SQL Server2008或2008CDC中可用,而R2需要企业版许可。

你尝试做的任何其他事情最终都会归结为以下两种之一:

  • 读取日志中的更改(这只能通过复制来完成,包括更改数据捕获,否则引擎将在您读取日志之前将其回收)
  • 跟踪触发器中的更改(更改跟踪将使用此功能)
  • 跟踪应用程序

中的更改

就是没有免费的午餐。如果需要审计,则必须考虑审计的开销,并且必须相应地进行容量规划。所有的数据审计解决方案都会引入大量的管理费用,因此运营成本增加2倍、4倍甚至10倍并不是闻所未闻的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3194496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档