在单个事务中执行SSDT项目/ dacpac部署脚本,包括前/后脚本

问题描述 投票:2回答:1

我正在使用SQLPackage.exe实用程序以及Database项目的发布配置文件来运行对SQL Server数据库的更改。

据我了解,这是部署过程:

部署前脚本


主要部署


部署后脚本


但是我在发布配置文件高级设置中选中了“包括事务脚本”选项,但这似乎仅适用于“主要部署”部分。

我的问题是:如果主部署失败,是否提交了预部署脚本?以及,如果部署后脚本失败,是否正在提交部署前更改和主要部署更改?

是否有可能使发布脚本“原子”-一切都作为一个单元成功或失败?

谢谢。

sql-server sql-server-data-tools database-project dacpac sqlpackage
1个回答
3
投票

您只需要在前脚本中打开事务并在后脚本中提交即可。当您将此设置设为打开时,它类似于SSDT生成的代码。

前脚本:

IF (SELECT OBJECT_ID('tempdb..#tmpErrors2')) IS NOT NULL DROP TABLE #tmpErrors2
GO
CREATE TABLE #tmpErrors2 (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
GO



--Your prescript part goes here



GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors2 (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END

发布脚本:

GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors2 (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END


GO

IF EXISTS (SELECT * FROM #tmpErrors2) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
PRINT N'Post/Pre script finished'
COMMIT TRANSACTION
END
ELSE PRINT N'Pre/Post scripts failed'
GO
DROP TABLE #tmpErrors2
GO
© www.soinside.com 2019 - 2024. All rights reserved.