我们有一个SQL 2019数据库,其中所有表名在视图中都是完全限定的,从数据库名称开始。我们不能选择避免完全限定的引用,因为视图定义是自动生成的(否则我就不会完全限定它们(。当通过引用与视图位于同一数据库中的表来定义视图时,SSDT项目会抱怨它有一个未解析的引用。
Visual Studio不允许向自身添加数据库引用。我能编译它的唯一方法是创建同一数据库的DACPAC,然后将其添加为引用,同时删除数据库变量($Name(。
有没有其他方法可以在视图中提供完全限定的表名,而不必在SSDT项目中创建DACPAC?
我所知道的唯一方法是将视图代码从项目中取出,并在部署后脚本中进行处理。这是经过设计的,因为数据库名称可能不是原始代码中定义的名称。
在SSDT中通常不能使用3-4部分命名。您可以通过在代码中使用变量来解决此问题。假设有了[localhost].[reports].[dbo].[your_table]
,就需要使用[$(ReportServer)].[$(ReportDatabase)].[dbo].[your_table]
。
我有一个包含对象的DacPac项目,这些对象使用三部分命名来引用包含的数据库(存在数百个实例,如[thisDb].[dbo].[obj]*(。我需要比较和更新这个数据库,但由于200多个sql71561错误,数据库项目未能构建。
我不想删除不必要的数据库名称部分或切换到使用数据库名称变量。为了使用三部分命名或完全限定的命名来引用本身成功地构建(或比较,然后更新(数据库,我找到了一种方法来安抚visual studio。这不是我想要的,但它有效。
- 创建原始数据库项目的副本
- 在复制数据库项目中,更新所有本地数据库对象引用,使其仅使用两个部分名称([dbo].[obj](,而不是三个部分名称
- 请确保复制数据库项目以相同的SQL server版本为目标并成功生成
- 从原始数据库项目引用复制数据库项目(无论是通过数据库变量、仅数据库名称还是dacpac(
- 现在可以生成原始数据库项目,因为可以解析其引用。你最终会得到一个原始和副本的dacpac,但至少错误已经消失,它可以编译