【问题标题】:Rolling back specific, older SQL transaction回滚特定的旧 SQL 事务
【发布时间】:2016-05-13 18:51:26
【问题描述】:

我们有一个相当大的存储过程,它合并了在我们系统中找到的两个名称相似的人。它删除和更新许多不同的表(大约 10 个左右,所有非常不同的表)。这一切都包含在事务中,如果失败当然会回滚。这可能是一个愚蠢的问题,但是是否有可能在以后以某种方式存储和回滚这个特定的事务,而不必创建并插入许多跟踪确切发生了什么的“历史”表?我不想在以后恢复整个数据库,只恢复存储过程特定事务的结果。

【问题讨论】:

  • 请注意,我也不想恢复整个表...只是最初受事务影响的记录。

标签: sql-server tsql transactions sql-server-2014


【解决方案1】:

听起来你可能想调查Change Data Capture

它仍然会在数据发生变化时捕获数据,如果您只为一次执行或非常少量的数据执行此操作,其他方法可能会更好。

【讨论】:

  • 谢谢,一定要读这个。乍一看,这听起来像是我想做的事情,但从来不知道这是一个功能……哈哈。 :)
【解决方案2】:

一旦提交了事务,就不可能在以后只回滚该事务。从字面上看,你是“承诺”的。您显然可以从备份中恢复并回滚自特定点以来的每个事务,但这可能不是您想要的。

因此,制作审计表是您唯一的选择。正如另一个答案指出的那样,您可以使用数据更改捕获,但除非您为企业版支付了大笔资金,否则这不是您的选择。但是,如果您只是对撤消这种特定类型的更改感兴趣,那么最简单的方法可能是在您的过程中添加一些代码来执行合并以存储重新拆分它们所需的数据记录并创建一个执行实际拆分的过程。但是您必须记住,您必须处理对“合并”数据的任何更改,这些更改可能会破坏您执行拆分的能力。这就是为什么 SQL 不能自动为您执行此操作的原因...它不知道您可能希望如何处理在原始事务之后可能发生的对数据的任何更改。

【讨论】:

  • 看来我只有标准版,所以 CDC 不适合我。这不好玩,但看起来审计表是我目前唯一的选择。我正在考虑制作每个要删除/更新的表的模式副本,以便以后撤消更改……或者一个包含表、键、字段、旧/新值和执行操作的表。无论哪种方式,我都了解了 CDC,它仅适用于企业版和变更跟踪,而这对我来说是行不通的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
相关资源
最近更新 更多