【发布时间】:2019-11-18 21:57:43
【问题描述】:
使用 SQL Server 2016
当源服务器无法访问同义词的实际目标表时,是否可以从链接服务器访问同义词?
一台服务器有两个数据库
说说
服务器1
数据库1 数据库2
服务器2
数据库3
并且database1上有一个表“table1”。
并且已在 database2 中创建了它的同义词
USE [database2]
GO
CREATE SYNONYM [dbo].[synonym1_for_table1] FOR [server1].[database1].[dbo].[table1]
GO
从 server2 可以访问 database2 的链接服务器
从server2执行以下查询时
SELECT *
FROM [server1].[database2].[dbo].[synonym1_for_table1]
遇到以下错误
无法处理对象 [database2].[dbo].[synonym1_for_table1]。这 链接服务器“server1”的 OLE DB 提供程序“SQLNCLI”表示 对象没有列或当前用户没有 该对象的权限。
在“链接服务器”下的 server2 中,在树下 我看到了 database2 的表和视图,但没有看到同义词。 有没有办法查看同义词。这可能是解决这个问题的方法。
更新:
如果将同义词设为视图,则会观察到以下错误
服务器主体“xyz”无法在当前安全上下文下访问数据库“database1”。
无法创建“xyz”/无法授予对“database1”的访问权限。
【问题讨论】:
-
不,你不能。这在documentation 中非常清楚(参见“使用同义词”之后的大注释)。但是您可以创建一个引用远程对象的本地同义词。
-
如果无法做到这一点,是否有一种解决方法可以在不将 database1 暴露给 server2 的情况下访问数据?
-
创建视图而不是同义词?取决于您的用例。
-
如果查看面临的以下错误服务器主体“xyz”无法在当前安全上下文下访问数据库“database1”。
-
是的,该消息意味着您拥有的用户无权访问该数据库。从我所见,您正在尝试公开数据库中的数据而不公开数据库中的数据?我认为你最好的选择是让有问题的用户(或角色)访问它在 database1 中需要的东西
标签: sql sql-server database