【发布时间】: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