Visual Studio 中的 DB 项目中的 DB 视图在同一项目中看不到同义词

Posted

技术标签:

【中文标题】Visual Studio 中的 DB 项目中的 DB 视图在同一项目中看不到同义词【英文标题】:DB View in DB project in Visual Studio can't see synonym in same project 【发布时间】:2021-01-13 16:16:35 【问题描述】:

我们的网络应用使用 4 个数据库,都在同一台服务器上。

这些数据库的 SQL 存储在我们解决方案的 4 个项目中。

我在一个数据库中有一个视图,该视图在另外两个数据库中使用。

这两个数据库都有视图的同义词,具有相同的名称。从数据库的角度来看,这非常有意义。

[database_1].dbo.Syn_AAAAAA 和 [database_2].dbo.Syn_AAAAAA 都指向 [database_3].dbo.vw_AAAAAA。

从 sql server 的角度来看,这很有意义。

应用程序运行良好。数据库很高兴。

Database1 在存储过程中使用[同义词 ==> 视图],一切正常。当代码在db项目中时,也可以。

在 database2 PROJECT 中,我在另一个视图中引用了 [同义词 ==> 视图]。当然,在数据库中工作正常。

但在项目中,使用同义词的视图令人窒息。就好像它看到了该名称的所有同义词,甚至是其范围之外的同义词,它所在的数据库。

select y.columnA, y.columnB, y.columnC, _l.columnD_, d3.columnE, d3.columnF
        from dbo.TableD d3
       inner join (subquery) y
          on y.columnA = d3.columnA
        left join _dbo.syn_AAAAAA_ l
          on _l.columnC_ = d3.columnC

(下划线表示来自 IntelliSense 的错误位置。)

如果我可以在服务器上编写称职的 SQL 代码,为什么我必须与 Visual Studio 争论将其存储在项目中?

SQL71501:视图:[dbo].[vw_AAAAAA] 包含对对象的未解析引用。 对象不存在或引用不明确,因为它可以引用以下任何对象: [$(ThisDB)].[dbo].[Syn_BBBBBB].[l]::[ColumnName], [$(ThisDB)].[dbo].[Syn_BBBBBB].[ColumnName] 或 [dbo].[Table].[l]::[ColumnName].

SQL71561:视图:[dbo].[vw_AAAAAA] 对对象的引用未解析 [$(ThisDB)].[dbo].[Syn_BBBBBB]

【问题讨论】:

the view that uses the synonym refuses to see the synonym 你一开始添加同义词了吗? why do I have to fight with Visual Studio 如果你忘记在服务器上创建同义词,你也会在那里得到错误 I reference the [synonym==>view] in another view. 参考如何?您是否添加了数据库引用?您是否修改了名称以使用服务器/数据库变量?这个问题缺少实际代码、错误信息、项目引用、项目结构。人们必须猜测可能是什么问题 我必须说,我看不到将 db 设计作为一个项目包含在解决方案中的任何好处。在机器上的 SQL DB 中工作要容易得多,而不是试图将所有 63 个项目捆绑在一起。 如果没有数据库项目,您必须等到部署到生产环境才能发现错误名称或类型等问题。您无法控制数据库的版本,也无法将更改部署到已部署的数据库。 另一方面,数据库引用在模式比较中可能会很麻烦。它们显示为差异,如果您将更改应用到您的项目,它们会毫无警告地丢失。对于跨数据库查询、视图和存储过程,这可能是一个真正的问题。至少对于同义词,您可以将所有此类引用放在一个地方 【参考方案1】:

同义词有问题。

为 [DBName].[dbo].[vw_xxxx] 创建同义词 [dbo].[syn_xxxx]

不得不改成

[$(DBNameVariable)].[dbo].[vw_xxxx] 创建同义词 [dbo].[syn_xxxx]

大多数时候 [DBName] 工作,但在这种情况下,我不得不使用 [$(DBNameVariable)]。

右键单击您的数据库引用,查看您要引用的数据库,看看是否有一个变量。 (我没有设置这个,所以这有点超出我的经验。)我的最后一个职位是,我们没有将 SQL 项目保留在我们的代码解决方案中。

【讨论】:

你发布的代码有人会立即发现问题 视图在数据库中工作。问题是解决方案中的 4 db 项目自己都跳闸了。我必须完全限定我的同义词才能告诉视图,“在你自己的数据库中查找这个同义词” dbo.syn_xxxx 在 SQL Server 上就足够了,但是项目本身就很纠结。 we didn't keep SQL projects in our code solution. 您必须将数据库源保存在某个地方,以便在实际部署到生产之前进行版本控制、差异化、部署和测试。 SQL 项目本质上是整个数据库的脚本。无论您选择哪种解决方案,您都必须做同样的事情。编译到dacpac和部署是很大的好处,但是SQL Project其实是一个SQL脚本的项目

以上是关于Visual Studio 中的 DB 项目中的 DB 视图在同一项目中看不到同义词的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Visual Studio 中的 C# 代码打开和关闭与服务器资源管理器中保存的数据库 (.db) 数据连接的连接?

Visual Studio 2010的任何DB2数据库项目支持?

visual studio 2010中调用另外一个项目中的方法

Visual Studio 宏

Visual Studio 2008 中的 C# 项目中的 C++ 项目参考

Visual Studio中的MSBuild项目