Sql-Server

回滾 DDL 語句組

  • November 30, 2012

在 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在您開始交易之前。然後,您可以在遇到第一個錯誤時回滾更改。

引用自:https://dba.stackexchange.com/questions/29544