【问题标题】:SQL Server Transaction rollbackSQL Server 事务回滚
【发布时间】:2017-08-25 19:06:44
【问题描述】:

我有以下代码。此代码在脚本执行时捕获脚本中的任何错误,并回滚从一开始所做的所有更改。这解决了我在发生任何事情时回滚事务的问题。

我的问题是,如果我必须为我在此脚本执行期间所做的所有事务编写回滚脚本(可以在测试应用程序后使用),我是否需要逐句执行并执行完全相反的操作

例如 - 在主脚本中,我执行 Insert Into Star Values 1 然后在回滚脚本中执行 从 id = 1 的星号中删除,或者是否有其他自动化方式。

就像我们可以以某种方式调用 SQL Server 事务日志并告诉它在稍后执行脚本期间反转它所做的事务。

--This works to roll back the changes during script execution
SET XACT_ABORT ON;
GO

BEGIN TRANSACTION
-- Batch 1
BEGIN TRY 
  CREATE TABLE Persons (
    PersonID int    
); 
END TRY
BEGIN CATCH 
  ROLLBACK TRANSACTION;
END CATCH;
GO  
-- Commit transaction
IF XACT_STATE() = 1
BEGIN
  COMMIT TRANSACTION;
  PRINT 'Transaction committed.';
END;

最终这就是我想要回滚我的脚本在以后的某个时间点所做的更新..说 3 天后..所以我今天运行我的脚本,它做了很多更改..使用 3 天后我感觉应用程序有问题,所以我想撤消脚本所做的所有更改。

【问题讨论】:

  • 我很困惑。听起来您只想不在最后提交事务。我读了你的问题3次,但仍然不明白你的意思。你说的脚本是什么?是不是其他东西会做一堆插入,然后你想退出这个?
  • 好的,所以在这种情况下,我认为您最好只备份您的数据库并在测试环境中运行它,除非您能够跟踪您更改的所有内容并反转它。
  • 备份数据库并恢复它不是一种选择。有没有其他方法。
  • SS2008 没有第三方产品,没有其他办法。一旦事务被提交,你就不能“撤消”它,也没有办法“反转”你的脚本,因为你怎么知道将行更新到什么?没有记录更新前该行是什么。
  • 事务没有办法做到这一点。如果要“回滚”表中数据的更改,可以考虑使用审计表(数据版本控制)。每当您更改实际表中的数据时,您都会通过触发器将旧值存储到审计表中。然后,一旦您想“回滚”更改,您可以查看审计表,获取特定日期的旧值并更新实际表。

标签: sql sql-server sql-server-2008 transactions


【解决方案1】:

根据您的问题,我发现确定您在现实世界中的实际用例有点困难。但是,数据库快照可能是您的选择。更多详情可在here in TechNet

如果源数据库发生用户错误,您可以将源数据库恢复到创建给定数据库快照时的状态。数据丢失仅限于自快照创建以来对数据库的更新。

但是,快照在数据库级别工作,不会特定于脚本中启动的 TRANSACTIONS,而是特定于数据库上的所有 CRUD 和 DDL 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多