我有一個TSQL腳本,它執行了很多數據庫結構調整,但是當某些事情失敗時讓它通過並不是很安全。在錯誤腳本中退出並回滾所有內容
來把事情說清楚:
- 使用MS SQL 2005
- 它不是一個存儲過程,只是一個腳本文件(.SQL)
我有什麼東西在下面訂單
BEGIN TRANSACTION
ALTER Stuff
GO
CREATE New Stuff
GO
DROP Old Stuff
GO
IF @@ERROR != 0
BEGIN
PRINT 'Errors Found ... Rolling back'
ROLLBACK TRANSACTION
RETURN
END
ELSE
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION
只是爲了說明我正在處理的事情......不能進入具體細節 現在,問題...
當我引入一個錯誤(測試是否回滾),我得到一個語句,ROLLBACK TRANSACTION找不到相應的BEGIN TRANSACTION。 這讓我相信,當真的錯誤和交易已經被殺死時, 我還注意到,腳本沒有完全放棄錯誤,因此DID在錯誤發生後嘗試執行每個語句。 (我注意到當新表出現時,當我不期待他們,因爲它應該回滾)
這基本上是我使用,但在以下形式: 如果@@錯誤<> 0或@@ TRANCOUNT = 0開始 \t \t如果@@ TRANCOUNT> 0回滾事務 \t \t集上 \t – 2010-06-10 07:55:48
端設置'NOEXEC on' NOEXEC是巧妙的方法,必須記住。 – Blorgbeard 2010-06-10 10:51:53
這是否適用於服務器級別的事務,如「DROP LOGIN」?我想更改登錄所屬的域,並從所有數據庫中刪除它,但需要重新創建,同時確保NOTHING被刪除,如果不是每個事務成功提交。這會導致錯誤映射的權限等,這將是一場災難。 – Chiramisu 2013-08-29 18:02:15