如何根据部署配置文件运行不同的前后SSDT发布脚本

Dou*_*oug 3 publish sql-server-data-tools

我在Visual Studio 2013中使用SSDT.

我为开发服务器创建了一些发布前和发布后脚本.预部署脚本从表中清空数据并重新设置所有自动标识字段.部署后脚本使用静态和示例数据填充表.

现在我需要将数据库发布到我们的登台和实时数据库服务器.我为这些服务器创建了新的"publish.xml"配置文件.但显然我不希望运行相同的前后脚本.

如何根据发布配置文件指定不同的脚本,或使脚本知道目标并执行不同的操作.

我最关心的是发布到实时服务器并意外破坏数据.

提前致谢.

道格

Ed *_*ott 6

你有几个选择:

1 - 在调用@servername或环境特有的内容中包含数据更改,这样您就可以:

if @@servername = 'dev_server'
begin
     delete blah
     insert blah

end
Run Code Online (Sandbox Code Playgroud)

2 - 你也可以使用sqlcmd变量实现类似的东西,传入一个名为"/ v:DestoryData = true"的变量,然后你可以在你的脚本中引用它.

3 - 不要使用前/后部署脚本,但有自己的运行机制,即使用批处理文件来部署dacpacs并在之前和之后添加对sqlcmd的调用 - 这样做的缺点是在部署时,更改为表导致在预部署之前禁用任何外键并在部署后重新启用.

4 - 编辑dacpacs,前/后部署脚本只是dacpac中的文本文件,它本质上是一个遵循microsoft打包格式的zip文件,并且有一个.net打包api可以让你修改它.

我认为这是关于它,请问是否有任何不清楚:)

ED


Vad*_*oda 5

我建议对条件脚本执行使用SQLCMD变量。

如果右键单击数据库项目并选择“属性”,则将有一个选项卡“ SQLCMD变量”

数据库属性

输入“ $(ServerName)”作为变量,并输入一些默认值。

然后,您需要在XML编辑器中打开EVERY .publish.xml,以便在PropertyGroup部分之后插入以下代码:

<ItemGroup>
    <SqlCmdVariable Include="ServerName">
        <Value>[YourVersionOfServer]</Value>
    </SqlCmdVariable>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

[YourVersionOfServer]应该等于每个服务器上@@ servername的结果。

最终的.publish.xml可能类似于:

在此处输入图片说明

然后,应使用以下命令将条件代码包装在部署之前和之后的文件中:

if @@servername = '$(ServerName)'
begin
    ... code for specific server
end
Run Code Online (Sandbox Code Playgroud)

因此,您可以保证正确的代码可以到达正确的服务器