使用 SqlPackage 发布 dacpac 时覆盖 DefaultDataPath 和 DefaultLogPath 变量

Overriding DefaultDataPath and DefaultLogPath variables when using SqlPackage to publishing a dacpac

环境:

  1. 在 Visual Studio 2013 更新 4 中使用 SQL 服务器数据库工具创建用于发布数据库的 DacPac。
  2. 使用 TFS 构建来构建和删除数据库项目。
  3. 使用 SqlPackage 版本将 dacpac 发布到 SQL Server 2012。

使用 SqlPackage 操作 "Publish",使用以下变量生成部署脚本基于目标数据库的默认值

:setvar DefaultDataPath "H:\YourServerDefault"
:setvar 默认日志路径 "H:\YourServerDefault"

我想覆盖这些位置以进入我们配置了一些外部加密的特定目录对。

我试图以几种方式覆盖这些 SQLCMD 值:

  1. 在命令行上覆盖:

    SQLPackage /Action:Publish /SourceFile:./Db.dacpac /Profile:./MyProfile.publish.xml /Variables:DefaultDataPath=H:\MyNewLocation

  2. 在发布配置文件中添加覆盖(下面的代码段):

<项目组>

H:\YourServerDefault

虽然我可以使用任何一种技术来覆盖我自己定义的 SQLCMD 变量,但会忽略内置变量,如 DefaultDataPath 和 DefaultLogPath。

有没有办法在使用 SqlPackage 发布时覆盖这些值?

SqlPackage 中没有内置支持,但您可以使用部署贡献者来实现。查看 GitHub 上的 DbLocationModifier 示例,它正好解决了这个问题。要实际使用它,您需要:

  • 从 Github
  • 下载代码
  • 向项目添加签名密钥
  • 安装到 correct extensions directory,或将其放在与 SqlPackage 本身相同的文件夹中。
  • 将附加参数传递给 SqlPackage,指定您的贡献者名称和参数 - 请参阅 test code 以了解如何通过 API 执行此操作,SqlPackage 调用本质上是相同的。

有关贡献者以及如何使用他们的更多信息,您可以阅读 MSDN 上的 tutorial I wrote or read the walkthroughs

披露:我在 SQL 服务器工具团队工作。