【问题标题】:access a synonym using linked server使用链接服务器访问同义词
【发布时间】: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


【解决方案1】:
  1. 您应该创建一个视图以从其他服务器/数据库上存在的表中读取数据。
  2. 另外,创建一个单独的用户(服务帐户或用户帐户),该用户只能从源表中读取数据,并且可以执行视图(存在于不同的服务器上)。

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多