具有变量替换的 Visual Studio 2012 数据库部署
Posted
技术标签:
【中文标题】具有变量替换的 Visual Studio 2012 数据库部署【英文标题】:Visual Studio 2012 Database Deployments with variable substitution 【发布时间】:2014-06-19 15:06:08 【问题描述】:我第一次在 Visual Studio 中为多个相关数据库设置部署。目前,我有三个数据库,分别称为 Database1、Database2 和 Database3。这些数据库具有多个部署级别(开发、测试、登台和生产)。
所以对于 Database1,我有 4 个发布配置:
Database1_ToDevelopment.publish.xml
Database1_ToTest.publish.xml
Database1_ToStaging.publish.xml
Database1_ToProduction.publish.xml
Production 位于它自己的服务器上,数据库实际上称为“Database1_production”。 Test 和 Staging 共享一个服务器,数据库称为“Database1_test”和“Database1_staging”。开发在它自己的服务器上,称为“Database1_development”。
我的问题是:同义词。
This answer is almost useful, but not quite
Database1_development 可能包含以下内容:
CREATE SYNONYM [dbo].[syn_mytable] FOR [Database2_development].[dbo].[mytable]
我不能把这个同义词从开发转移到测试。我需要用“_development”部分替换“_test”。这是基于部署的。
我想我想知道的是如何根据部署获取变量替换。
当然,然后我部分回答了我自己的问题。我发现这张图片正是我想要的,但没有解释为什么这个对话框有这个部分(没有解释,所以没有链接)。该对话框看起来很熟悉,但 VS 2012 中没有 SQLCMD 变量部分。
事实证明,这部分对话框不会显示,除非您编辑发布配置文件的 XML 文件以添加如下内容:
<ItemGroup>
<SqlCmdVariable Include="DBLevel">
<Value>Dev</Value>
</SqlCmdVariable>
</ItemGroup>
我是通过this SO 问题找到的,然后是 Jamie Thomson 的blog post。
下次再次打开发布对话框时,它会神奇地出现。
那么在同义词定义中我只能说:
CREATE SYNONYM [dbo].[syn_mytable] FOR [Database2_$(DBLevel)].[dbo].[mytable]
这是我最想要的。
【问题讨论】:
很确定您在项目属性中定义了变量。然后,您将这些值放入您的发布配置文件中。我们已经将这些用于链接服务器和硬编码在我们的一些遗留存储过程中的不同文件路径之类的东西。不过,这正是我建议的解决方案。 【参考方案1】:解决方案是使用来自MsBuild Community Tasks lib 或任何其他任务库的 ExecuteSQL 或 ExecuteDDL 任务来创建环境特定的别名作为构建过程的一部分(例如构建后事件)。这样您就可以将数据库名称存储为 MSBuild 属性。
【讨论】:
老实说,我们正在拼命地尝试远离我们的构建和部署的非标准工具包。不过还是谢谢你的建议。以上是关于具有变量替换的 Visual Studio 2012 数据库部署的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2019正在引发有关具有没有默认值的变量的结构的警告
在 ABI 级别的 Visual Studio 中使用 C++ 重新实现 DLL 方法变量