簡體   English   中英

SQL Server事務回滾

[英]SQL Server Transaction rollback

我有下面的代碼。 該代碼在執行腳本時捕獲腳本中的任何錯誤,並回滾從頭開始所做的所有更改。 這解決了我發生任何事情時都回滾事務的問題。

我的問題是,是否需要為在此腳本執行過程中進行的所有事務編寫回退腳本(以后可以在測試應用程序之后使用),是否需要逐條語句執行相反的操作?

例如-在主腳本中,我將插入星值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天后感覺到有問題,所以我想撤消腳本所做的所有更改。

根據您的問題,我發現確定您實際的實際用例有些困難。 但是,數據庫快照可能是您的一個選擇。 可以在TechNet的此處找到更多詳細信息

如果源數據庫上出現用戶錯誤,則可以將源數據庫還原為創建給定數據庫快照時的狀態。 自快照創建以來,數據丟失僅限於對數據庫的更新。

但是,快照可以在數據庫級別工作,而不是特定於腳本內啟動的事務,而是特定於數據庫上的所有CRUD和DDL操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM