【问题标题】:Sql Server, find all rows that have been updated by a statementSql Server,查找已被一条语句更新的所有行
【发布时间】:2010-07-07 12:09:30
【问题描述】:

有没有办法找到所有已由单个语句更新的行,sql 本身必须跟踪这一点,因为它可以在需要时回滚更新。我有兴趣查找所有已更改的行,因为我正在使用更新触发器获得性能。

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

我已经想到了一些选择

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

其他人解决了这个问题吗?

【问题讨论】:

  • 什么版本的 SQL Server?你能发布你当前的触发代码吗?

标签: sql-server triggers


【解决方案1】:

UPDATE 触发器已经在插入和删除的伪列中包含受更新语句影响的记录。您可以将它们的主键列选择到用作队列的初步审计表​​中,并将更复杂的计算移至单独的作业中。

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

【讨论】:

  • 可能在2008年更新或修改,但在SQL 2005中增加了OUTPUT。
  • Phillip 和 Devio 我认为 Output 子句是我正在寻找的确切答案。我会调查表现并报告。
【解决方案2】:

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

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

【讨论】:

  • 为了清楚起见,@munissor 指的是时间戳数据类型,而不是任何日期/时间数据类型。
【解决方案3】:

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

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

  • 读取日志以了解更改(这只能通过复制实现,包括更改数据捕获,否则引擎会在您读取之前回收日志)
  • 跟踪触发器中的更改(这是更改跟踪将使用的)
  • 跟踪应用程序的变化

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

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多