SSDT/ VS2015 数据库部署——发布忽略嵌套视图

SSDT/ VS2015 Database deployment -- publishing is ignoring nested views

我正在尝试获取有关 SSDT 数据库开发和部署的一些知识和用例,并努力解决一些部署问题。

特别是在使用嵌套视图时。由于某些未知原因,当尝试将项目中的文件部署/发布到本地/实时数据库时,它似乎弄乱了视图中的引用。

在这个项目中我有以下观点(例子):

View1 引用 View2,View3 引用 View1。

构建项目工作正常。然而,当我尝试通过快照生成 dacpac 并将其发布到数据库或让 Visual Studio 在(或不)比较模式之后生成更新脚本来发布数据库时,我最终得到了一个尝试创建的更新脚本视图的存储顺序似乎是它们在项目中的逻辑顺序。

在本例中,View1 -> View2 -> View3。这意味着发布由于引用问题而失败。如果引用的视图不存在,则无法创建视图。

我已经尝试了几种选择,通过以各种方式将 dacpac 添加为项目中的参考(相同的数据库,相同的服务器不同的数据库 w/ w/o 数据库参数)但在很多情况下我最终得到一个 sql71561 / SQL71508 错误,这是另一个需要解决的 PITA。

我在网上找不到任何好的资源来解释如何解决这个问题或解释它如何正常工作。

希望我能在这里得到一些帮助。如果您需要我的额外意见或希望我尝试一些事情,请告诉我。

问题已通过新见解得到解决。在尝试构建演示代码以与 SO 社区共享时,我无意中找到了解决方案,因为我需要清理敏感数据(模型)部分。请让我详细说明问题所在。

方案分为两种方案:

  • 数据库项目/解决方案配置
  • 引用的工作方式

我将就这两个问题分享一些见解。

数据库项目/解决方案配置

Visual Studio 解决方案包含一个项目,其中放置了所有视图。实际表和其他数据库项目在不同的解决方案/项目中分开。

Solution1
  Project1
    View1
    View2
    View3

Solution2
  Project1
    Tables
    Security
    Schemas
    Etc...

视图本身包含三部分标识符 [Database].[Schema].[Table/View]。这既针对项目内部的项目(视图),也针对项目外部的项目(表格等)。

仅使用一个单独的项目和视图导致缺少引用。它无法找到其他视图或表格(进一步参见参考资料)。

此问题的一个解决方案是确保引用的视图和表都在同一个解决方案/项目中。即使使用三部分标识符 Visual Studio 也会忽略这些,因为同一项目/解决方案中存在所有项目。它将以这种方式检测依赖关系。

引用的工作方式

另一种解决方法是在 visual studio 中正确使用引用。这是第二种可能的解决方案。

考虑前面的示例,其中视图与其他元素位于不同的解决方案中,导致引用丢失。但是,使用相同数据库设置将 dacpac 添加为数据库引用会导致引用冲突,并且模型中已存在 SQL71508 元素。这是真的,因为它存在于引用 dacpac 中,我们尝试创建一个在 dacpac 中引用自身的同名新视图。这是因为它将三部分引用视为 dacpac 的变量。

当对同一个服务器、不同的数据库使用 dacpac 设置时,它会解析混合引用,因为它将三部分标识符视为外部引用,并认为您创建了一个正在查看的视图的本地副本外部 dacpac。换句话说,它不会检测嵌套视图,因为它认为您引用的是不在项目内部的单独数据库。

构建项目时,这不会导致错误,并且部署会正常进行。然而,由于它认为您正在引用外部数据源(以 dacpac 的形式),因此它看不到对其他本地视图的引用。

这个问题的解决方案(至少这对我们有用)是当我们需要对其他视图的本地引用时在我们的视图中使用两部分标识符。这样它将查看项目中的其他文件而不是引用的 dacpac。

由于它将检测对其他本地视图的引用,因此它将正确构建并检测本地项目内视图中的依赖关系。然后它将为所有视图创建良好的构建顺序。

我想您也可以为引用的 Dacpac 分配一个不同的变量名称,一直使用三部分标识符,但将外部 dacpac 中的标识符更改为使用新分配的变量名称。我们还没有测试过这个(但我会在今晚回家时测试)。

因此,总而言之,这是一次很好的学习体验,了解在使用部分项目或将数据库拆分为多个项目/解决方案时,数据库引用如何在数据库项目中工作。现在了解这个潘多拉的黑匣子并将其转换为面向未来的解决方案:)