如何在SQL Server上启用DDL事务

时间:2011-10-19 15:39:26

标签: sql sql-server sql-server-2008

  

可能重复:
  Is it possible to run multiple DDL statements inside a transaction (within SQL Server)?

如果我有以下脚本:

BEGIN TRAN
GO

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_1]
GO

ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_2]
GO
COMMIT TRAN

Transcation不起作用。它仍然在交易一个声明中。例如,如果语句1失败,则在运行脚本时仍然会完成语句2。

如何为DDL启用交易?

3 个答案:

答案 0 :(得分:2)

您正在分批运行DDL,因此,如果您的第一个语句引发的任何内容少于连接终止错误(硬件问题等),则第二个批次将运行。

Management studio将GO视为批处理分隔符,并分别运行每个批处理。

您可以使用SET XACT_ABORT ON在发生错误时自动回滚您的事务。您也可以删除GO语句,因为ALTER TABLE语句不需要在不同的批处理中运行。

答案 1 :(得分:0)

MagicMike是对的,但我实施了另一个我知道效率很高的解决方案(即使他的解决方案看起来更优雅)。 仅供参考,我的解决方案包含两个事务和一个干净的错误管理(SQL Server上存在@@错误功能,检查SQL上的等效项,在Oracle中它应该类似于“其他时的异常”而不是“If(@@ error) = 0)“):

begin tran

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_1]

IF (@@Error=0)
begin
    COMMIT TRAN
end
else
begin
    rollback tran
END

begin tran    
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_2]

IF (@@Error=0)
begin
    COMMIT TRAN
end
else
begin
    rollback tran
END

答案 2 :(得分:0)

您无需禁用或启用DDL命令

请执行以下操作 你可以用

Begin Try
.......
End Try
Begin Catch
.......
End Try

以你的例子来说 你可以这样做

begin try

ALTER TABLE [dbo].temp CHECK CONSTRAINT [FK_1]
--GO

ALTER TABLE [dbo].temp CHECK CONSTRAINT [FK_2]
--GO

end try

begin catch
    print 'Error in the Try Block'
end catch