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

时间:2016-02-22 21:18:00

标签: sql-server visual-studio sql-server-data-tools database-deployment

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

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

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

  • View1
  • 视图2
  • VIEW3

View1引用View2和View3引用View1。

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

在这种情况下,View1 - > View2 - > VIEW3。这意味着发布因参考问题而失败。如果引用的视图不存在,则无法创建视图。

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

在线我找不到任何可以解决如何解决这个问题或者解释这是如何正常工作的好资源。

希望我能在这里得到一些帮助。如果您需要我方的额外输入或想让我尝试一些让我知道的事情。

1 个答案:

答案 0 :(得分:2)

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

解决方案可分为两种解决方案:

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

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

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

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

Solution1
  Project1
    View1
    View2
    View3

Solution2
  Project1
    Tables
    Security
    Schemas
    Etc...

视图本身包含三部分标识符[数据库]。[模式]。[表/视图]。这既是项目内部的项目(视图),也是项目外部的项目(表格等)。

只使用那个单独的项目只有视图导致缺少引用。它无法找到其他视图和表格(进一步参见参考文献)。

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

引用工作的方式

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

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

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

构建项目时,这不会导致错误,部署也会起作用。但是因为它认为你引用了一个外部数据源(以dacpac的形式),所以它没有看到对其他本地视图的引用。

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

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

我猜你也可以为引用的Dacpac分配一个不同的变量名,一直使用三部分标识符,但更改外部dacpac中的变量名以使用新分配的变量名。我们还没有对此进行过测试(但是当我今晚回到家中时我会这样做。)

因此,在使用部分项目或将数据库拆分为多个项目/解决方案时,所有这些都是数据库引用如何在数据库项目中工作的良好学习经验。现在要了解潘多拉的黑匣子并将其转换为面向未来的解决方案:)