Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在单个事务中执行SSDT项目/dacpac部署脚本,包括前/后脚本_Sql Server_Sql Server Data Tools_Database Project_Dacpac_Sqlpackage - Fatal编程技术网

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

Sql server 在单个事务中执行SSDT项目/dacpac部署脚本,包括前/后脚本,sql-server,sql-server-data-tools,database-project,dacpac,sqlpackage,Sql Server,Sql Server Data Tools,Database Project,Dacpac,Sqlpackage,我正在使用SQLPackage.exe实用程序和数据库项目的发布配置文件来运行对SQL Server数据库的更改 据我所知,这是部署过程: 部署前脚本 主要部署 部署后脚本 我在发布配置文件高级设置中选中了Include transactional scripts选项,但是,它似乎只适用于主部署部分 我的问题是:如果主部署失败,是否提交了预部署脚本?此外,如果部署后脚本失败,是否提交部署前更改和主部署更改 是否可以将发布脚本原子化—所有内容都作为单个单元成功或失败 谢谢。您只需在pre脚本中打开

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

据我所知,这是部署过程:

部署前脚本 主要部署 部署后脚本 我在发布配置文件高级设置中选中了Include transactional scripts选项,但是,它似乎只适用于主部署部分

我的问题是:如果主部署失败,是否提交了预部署脚本?此外,如果部署后脚本失败,是否提交部署前更改和主部署更改

是否可以将发布脚本原子化—所有内容都作为单个单元成功或失败


谢谢。

您只需在pre脚本中打开事务,然后在post脚本中提交即可。当您设置此设置时,它与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

好问题。我还没有找到实现这一目标的方法。您可以将部署前脚本和部署后脚本放在自己的事务中,但它不会回滚它运行的所有DDL。部署前脚本和部署后脚本在其余事务之外运行。你需要以某种方式实现自己的目标。理想情况下,在测试环境中运行并确保没有外部更改可能是确保一切顺利运行的最佳选择。谢谢,是的,这正是我想要的。