可能重复:
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启用交易?
答案 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