【问题标题】:SQL Database Project: build different scripts depending on build configurationSQL 数据库项目:根据构建配置构建不同的脚本
【发布时间】:2013-02-27 16:32:05
【问题描述】:

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

假设我们有两个 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 的文件,这是一个反序列化和缓存的数据库模型,如 here 所述。

在重新创建 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 目标?

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

【问题讨论】:

    标签: visual-studio-2012 msbuild database-project sql-server-data-tools msbuild-target


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 彼得感谢您的回复。我的问题仍然没有解决方案。我会为下一个项目尝试你的建议。但我想,将创建表/视图的创建移动到 Post-Deploy 脚本会在构建过程中给我们带来错误,因为其他对象引用了这些表/视图。
      • 好吧,从技术上讲,您可以在项目的“本地”视图中保留所有内容,以便构建所有内容,然后添加一个部署后部分,仅在您将使用它们。我同意这不是处理它的最佳方式,但如果你这样做,它应该可以工作。
      • 在使用复合项目时,您可能还有另一种可能的选择。 Jamie Thompson 在这里写了关于他们的博客:sqlblog.com/blogs/jamie_thomson/archive/2013/03/10/…
      • 虽然从一开始解决任务的方式不同,但似乎是对主题问题的一种决定。彼得,我可以请您添加您的评论作为答案吗?我会检查它作为接受的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2019-07-20
      • 2018-07-06
      • 1970-01-01
      • 2012-09-18
      • 2013-12-03
      相关资源
      最近更新 更多