如何在构建期间通过 MSBuild 传递 SQLCMD 变量?

问题描述

我在第二个数据库项目中发布期间引用了一个数据库项目。为了便于参考,我们称它们为 DatabaseDatabase.TestsDatabase 正被 Database.Tests

引用

在部署期间,数据库项目将在同一台机器上部署两次。一次作为“数据库”,一次作为“Database.Tests”的一部分

使用发布选项手动执行此操作按预期工作,但是当使用 SqlPackage.exe 时,我在发布 seoncd 数据库时遇到错误:

*** Could not deploy package.
Error SQL72014: .Net SqlClient Data Provider: Msg 33415,Level 16,State 4,Line 5 FILESTREAM DIRECTORY_NAME 'AZE' attempting to be set on database 'Database.Tests' is not unique in this SQL Server instance. Provide a unique value for the database option FILESTREAM DIRECTORY_NAME to enable non-transacted access.
Error SQL72045: Script execution error.  The executed script:
IF EXISTS (SELECT 1
           FROM   [master].[dbo].[sysdatabases]
           WHERE  [name] = N'$(DatabaseName)')
    BEGIN
        ALTER DATABASE [$(DatabaseName)]
            SET FILESTREAM(NON_TRANSACTED_ACCESS = FULL,DIRECTORY_NAME = N'AZE'),CONTAINMENT = NONE
            WITH ROLLBACK IMMEDIATE;
    END

这就是我正在做的事情。第一件事是创建测试数据库。为此,我使用以下 sqlPackage.exe 命令部署 tSQLt、数据库项目和最后的 database.tests 项目:

"C:\Program Files\Microsoft SQL Server\150\DAC\bin\SqlPackage.exe" /Action:Publish ^
    /SourceFile:"Database.dacpac" ^
    /TargetDatabaseName:"Database.Tests" ^
    /TargetServerName:"server\instance" ^
    /v:MSSQL_USER="some_user" ^
    /v:MSSQL_PASSWORD="somepassword"

"C:\Program Files\Microsoft SQL Server\150\DAC\bin\SqlPackage.exe" /Action:Publish ^
    /SourceFile:"Database.dacpac" ^
    /TargetDatabaseName:"Database.Tests" ^
    /TargetServerName:"server\instance"

"C:\Program Files\Microsoft SQL Server\150\DAC\bin\SqlPackage.exe" /Action:Publish ^
    /SourceFile:"Database.Tests.dacpac" ^
    /TargetDatabaseName:"Database.Tests" ^
    /TargetServerName:"server\instance"

# at this point we deploy the second database into a database called `Database`   

"C:\Program Files\Microsoft SQL Server\150\DAC\bin\SqlPackage.exe" /Action:Publish ^
    /SourceFile:"Database.dacpac" ^
    /TargetDatabaseName:"Database" ^
    /TargetServerName:"server\instance" ^
    /v:MSSQL_USER="some_user" ^
    /v:MSSQL_PASSWORD="somepassword"

我能否在部署时动态更改文件流目录设置或以其他方式规避此问题?从理论上讲,我只需要测试数据库中 Database 项目中的架构、过程和函数来执行我的 tSQLt 测试,不需要其他任何东西。

解决方法

这可能无法直接回答您的问题,但在这里。

我们广泛使用 SSDT 和 tSQLt。在我们的数据库解决方案中,单元测试驻留在它们自己的项目中。 (使用复合项目,根项目是所有环境通用的一切;开发、阶段、生产和单元测试是解决方案中的独立项目。)开发项目具有对单元测试项目的数据库引用。引用被标记为相同的数据库。这样,当开发人员部署时,它会携带单元测试项目项。并且单元测试项目不需要 FILESTREAM 设置。

FILESTREAM 设置将与每个环境项目相关,并且不会在单元测试项目中。这样就只部署了一个引用。

如果您的解决方案中只有根项目和单元测试项目,您仍然可以使用如上所述的数据库引用来完成它。无论哪种方式,单元测试项目都不会直接部署,只能从解决方案中的另一个项目中引用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...