2017-08-25 98 views
0

我有以下代碼。該代碼捕獲腳本執行過程中的任何錯誤,並回滾從開始進行的所有更改。這解決了我發生任何事情時回滾事務的問題。SQL Server事務回滾

我的問題是,如果我必須編寫一個回滾腳本(可以在測試應用程序後稍後使用),以執行在此腳本執行期間所做的所有事務嗎?是否需要按語句聲明並做相反的事情

例如 - 在主要腳本中我插入星號值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; 

歸根結底,這就是我要的是after..So今天我跑我的腳本回滾我的劇本在稍後進行的更新中time..say 3天,這讓一堆的變化..在使用應用程序3天后,我感覺有些問題是錯誤的,所以我想撤銷腳本所做的所有更改。

+0

我很困惑。這聽起來像你只是想*最後提交交易。我讀了你的問題3次,但仍然沒有明白你的意思。你說的**劇本是什麼?是否有其他東西會製作一堆插頁,然後你想退出? – scsimon

+0

對不起,如果我讓它感到困惑..我想要的是回滾我的腳本在稍後的時間點做出的更新..在2天后...所以我今天運行我的腳本,它做了一堆改變..後3天使用應用程序我感覺有些問題是錯誤的,所以我想撤銷腳本所做的所有更改。 – user1221989

+2

好吧,那麼在這種情況下,我認爲只需備份數據庫並在測試環境中運行它就行了,除非您能夠跟蹤所有更改並將其反轉。 – scsimon

回答

0

根據你的問題,我發現有點難以確定你的真實世界用例。但是,數據庫快照可能是您的一個選項。更多細節可以在here in TechNet

發現在源數據庫的用戶錯誤的情況下,你能恢復的源數據庫,這是創建一個給定的數據庫快照時的狀態。數據丟失侷限於自創建快照以來更新數據庫。

但是,快照在數據庫級別工作,並不是特定於在腳本中啓動的TRANSACTIONS,而是特定於數據庫上的所有CRUD和DDL操作。