3

环境:

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

使用 SqlPackage 操作“发布”,部署脚本是根据目标数据库的默认值使用以下变量生成的:

:setvar DefaultDataPath "H:\YourServerDefault"
:setvar DefaultLogPath "H:\YourServerDefault"

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

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

  1. 在命令行上覆盖:

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

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

    <ItemGroup>
      <SqlCmdVariable Include="DefaultDataPath ">
        <Value>H:\YourServerDefault</Value>
      </SqlCmdVariable>
    </ItemGroup>

虽然我可以使用任何一种技术来覆盖我自己定义的 SQLCMD 变量,但是像 Def​​aultDataPath 和 DefaultLogPath 这样的内置变量会被忽略。

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

4

1 回答 1

3

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

  • 从 Github 下载代码
  • 向项目添加签名密钥
  • 安装到正确的扩展目录,或者把它和 SqlPackage 本身放在同一个文件夹中。
  • 向 SqlPackage 传递额外的参数,指定您的贡献者名称和参数 - 请参阅测试代码以了解如何通过 API 执行此操作,SqlPackage 调用本质上是相同的。

有关贡献者以及如何使用它们的更多信息,您可以阅读我编写的教程或阅读 MSDN 上的演练

披露:我在 SQL Server 工具团队工作。

于 2015-03-07T06:56:26.270 回答