我有一个场景,用户想要通过链接服务器执行以下操作:
SELECT *
FROM [DBTEST].[AdventureWorks].sys.objects
WHERE object_id = OBJECT_ID(N'dbo.DatabaseLog');
链接服务器被配置为使用Be made using this security context
并且链接服务器登录对[DBTEST].[AdventureWorks]
数据库具有读取访问权限。
上述查询在通过链接服务器执行时不返回任何行。但是,当我直接登录到DBTEST
使用链接服务器登录并执行以下操作时,它确实返回一行:
SELECT *
FROM [AdventureWorks].sys.objects
WHERE object_id = OBJECT_ID(N'dbo.DatabaseLog')
我很困惑为什么它不能通过链接服务器工作,以及我需要做什么才能修复它。
一件更奇怪的事情是,即使我授予sa
链接服务器登录权限,它在通过链接服务器执行时仍然不返回任何行。
两台服务器都是 SQL Server 2008 企业版。
这个问题与安全无关:-)。
在您的查询中,您正在从远程系统上的表中进行选择,但 WHERE 条件正在使用该
OBJECT_ID()
功能,该功能只能看到本地实例,并且未在 Linked Server 连接范围内运行。你为什么不试试:
无论如何,该查询更有意义,因为您已经有了名称,因此查询从名称中获取 ID 只是为了在第二个查询中使用 ID 是没有意义的;-)。
如果您希望/还需要过滤 Schema 名称,那么您必须将 JOIN 添加到
[DBTEST].[AdventureWorks].sys.schemas
表中,因为OBJECT_SCHEMA_NAME
它也是本地范围。@srutzky 是正确的 - 这与安全无关。正如他所说,该
OBJECT_ID()
函数是针对本地 SQL Server 实例而不是远程实例运行的。如果要对远程服务器执行未更改的语句,则需要通过动态 T-SQL 运行它,使用以下命令:
这将
@sql
在远程服务器上执行全部内容。