Sql-Server
回滾 DDL 語句組
在 SQL Server 2008 R2 中工作,我試圖將一組 DDL 語句作為一個組回滾(想想數據庫的升級腳本),但遇到了麻煩。
採取以下程式碼:
begin try begin tran create table foo (i int) alter table foo add x dog insert into foo select 1,1 insert into foo select 1,1,1 commit tran end try begin catch rollback tran print @@error end catch
我希望嘗試在 alter table 語句上失敗,進入 catch,回滾事務,並列印錯誤消息。但是,如果您檢查對象/表,您會看到 foo 仍然存在(因此創建表沒有正確回滾)。
select * from sys.objects where name = 'foo'
我在這裡做錯了什麼?
您看到此結果的原因是 SQL Server 實際上沒有擷取您的 ALTER TABLE 錯誤。您會注意到,當您執行此程序時,您會看到紅色錯誤消息而不是列印行——您可以通過更改
print @@error
為類似print 'HELLO!'
;來驗證這一點。在這種情況下,您不會看到“你好!” 列印; 您將看到錯誤。Books Online列出了您無法捕捉到的錯誤案例。這裡的另一種選擇是
SET XACT_ABORT ON
在您開始交易之前。然後,您可以在遇到第一個錯誤時回滾更改。