SQL数据库项目:根据构建配置构建不同的脚本

Vad*_*oda 5 msbuild database-project msbuild-target visual-studio-2012 sql-server-data-tools

我想解决的问题是根据构建配置构建不同的脚本.

假设我们有两个SQL Server实例:

  • 已连接链接服务器的企业版
  • 用于离线开发和单元测试的LocalDb版本

当LocalDB使用本地表替换这些视图时,企业版具有链接服务器的视图.

这些链接服务器视图和本地表具有相同的名称和字段集.因此默认情况下它们不包含在构建中(Build Action = None).相反,它们包含在项目文件的BeforeBuild Target中.

<Target Name="BeforeBuild">

    <ItemGroup Condition=" '$(Configuration)' == 'LocalDb'">
        <Build Include="Local_Tables\*.sql" />
    </ItemGroup> 

    <ItemGroup Condition=" '$(Configuration)' != 'LocalDb' ">
        <Build Include="Linked_Server_Views\*.sql" />
    </ItemGroup>

</Target>
Run Code Online (Sandbox Code Playgroud)

但问题是Visual Studio缓存数据库模型,如果我们首先为LocalDb构建项目,然后尝试构建企业配置项目 - Visual Studio输出错误:

错误:SQL71508:模型已经有一个具有相同名称的元素

如果要关闭并打开解决方案或卸载项目和重新加载项目,Visual Studio将重新创建dbmdl文件,并且正在构建企业配置而不会出现错误.

所以我的假设是,如果我刷新dbmdl缓存,我将得到平滑的构​​建,没有错误.


当您打开或在Visual Studio 2012重装SQL Server数据库的项目,它将创建一个具有扩展名的文件dbmdl,这是作为描述的反序列化和缓存数据库模型在这里.

在dbmdl文件重新创建的那一刻,Visual Studio输出以下内容:

Deserializing the project state for project 'MyProject.sqlproj'...
Detecting file changes for project 'MyProject.sqlproj'...
Deserialization has been completed for project 'MyProject.sqlproj'.
Run Code Online (Sandbox Code Playgroud)

如何在没有项目重新加载且不更改项目xml文件的情况下强制Visual Studio刷新dbmdl缓存?

有没有办法刷新dbmdl缓存,将命令放入项目xml文件的BeforeBuild或AfterBuild目标?

或者问题的整个方法是错误的,还有另一种方法可以根据构建配置构建不同的脚本?

Pet*_*ott 4

使用复合项目时您可能还有另一种可能的选择。Jamie Thompson 在博客中介绍了它们:http://sqlblog.com/blogs/jamie_thomson/archive/2013/03/10/deployment-of-client-specific-database-code-using-ssdt.aspx

这将允许您构建一个主项目,并将其他项目与特定于环境的代码联系起来。您可以通过在发布脚本中进行一些检查来部署适当的版本。


归档时间:

查看次数:

4510 次

最近记录:

12 年,5 月 前