您好,我有 2 个不同的 SQL Server 数据库。
它们通过链接服务器相互连接。链接服务器工作正常。
当我尝试时:
SELECT
*
FROM
OPENQUERY
([192.168.1.170],
'SELECT MalCRM.dbo.ContractedNumber(1)')
我收到以下错误。我该如何解决它?
链接服务器“192.168.1.170”的 OLE DB 提供程序“SQLNCLI11”返回消息“无法完成延迟准备。”。 消息 229,第 14 级,状态 5,第 1 行 对象“ContractedNumber”、数据库“MalCrm”、架构“dbo”的 EXECUTE 权限被拒绝。
梅尔哈巴·贝尔汉,
我尝试了以下 sql 查询,效果很完美
SELECT * FROM OPENQUERY([myInstance], 'SELECT AdventureWorks.dbo.test(3)')
您检查数据库功能上的凭据是否有效? 这似乎是一个权限问题。 请检查SQL Server链接服务器安全上下文并检查它是否具有数据库对象的执行权限。 在提到的教程中,在安全上下文中,您可以将源数据库用户映射到链接服务器上的其他用户。 可能是这个问题
就我而言,权限是完美的,我可以通过 OpenQuery 访问表,但直接选择是行不通的。所以
select * from MyLinkedServer.Database.dbo.Table
会给我
Msg 7313, Level 16, State 1, Line 1
An invalid schema or catalog was specified for the provider "SQLNCLI11" for linked server "MyLinkedServer".
但是如果我这样做了:
select * from OPENQUERY([MyLinkedServer], 'SELECT * from Database.dbo.Table')
效果很好。如果我直接使用链接服务器用户使用的帐户登录,我还可以在源服务器上很好地查询表。
我的情况的问题是,表名称末尾有一个(无效)空格和/或其他高位 ASCII 字符,显然链接服务器连接必须对名称严格,而其他查询则不然(我确信某处有一篇关于此的文章,但我懒得去找它)。
无论如何,我通过右键单击对象管理器中链接服务器下的表并单击“将表脚本为... --> 选择到”来解决这个问题,这将编写选择脚本并显示选择需要是
select * from [MyLinkedServer].[Database].[dbo].[Table ]
(注意“e”和“]”之间的空格)