5

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

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

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

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

那些链接服务器视图和本地表具有相同的名称和字段集。因此默认情况下它们不包含在构建中(构建操作 = 无)。相反,它们包含在项目文件的 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>

但问题是 Visual Studio 缓存了 DB 模型,如果我们首先为 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'.

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

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

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

4

2 回答 2

4

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

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

于 2013-05-28T15:37:06.660 回答
1

我正在考虑这个问题以及使用 SSDT 处理它的最佳方法。我可能没有“最佳”方式,如果您可以在发布更改之前确定正确的版本,我会考虑:

  1. 为每个版本创建一个发布配置文件 - 有和没有链接服务器。
  2. 创建变量来保存您的链接服务器名称,可能还包括数据库,例如“[Server].[Database]”。
  3. 为您的链接服务器视图创建一个部署后脚本。这些应该包括权限、链接服务器名称的变量等等。
  4. 在 Post-Deploy 脚本中,查询您的“版本”变量。如果它将使用链接服务器,请在项目中删除/重新创建本机非链接服务器视图以使用链接服务器上的视图。或者,将变量设置为本地视图的空字符串和链接服务器的服务器/数据库,您可能只使用一组代码。

这样做的缺点是无法对视图进行代码检查,但会给您一个存储链接服务器视图的位置和一个部署它们的位置。您需要使用 Drop/Create 发布,而不是让 SSDT 处理更改,这意味着它们将在每个 Publish 操作中重新创建。不过,我认为它可能会为您提供所需的解决方案。

于 2013-05-10T17:32:48.193 回答