如果使用非管理员帐户,SQL链接服务器会产生错误“无登录映射”

时间:2015-08-19 00:00:27

标签: sql sql-server security linked-server

我有一个本地SQL Server 2008R2。我已将Linked Server配置为远程数据库。

使用具有sysadmin服务器角色的SQL登录帐户登录本地服务器时,链接服务器工作正常。我可以查询远程服务器,所以我知道链接服务器设置是正确的。但是,如果我使用的帐户没有sysadmin服务器角色,我会收到以下错误。

Msg 7416, Level 16, State 2, Line 2
Access to the remote server is denied because no login-mapping exists.

对于本地和远程服务器,使用SQL登录(不使用Windows身份验证)

我需要为常规SQL登录帐户配置哪种安全性才能使用链接服务器?

3 个答案:

答案 0 :(得分:13)

根据this blog,如果使用非sysadmin帐户,我必须在提供程序字符串中指定User ID。这是一个例子。

EXEC master.dbo.sp_addlinkedserver 
    @server = N'MyLinkServerName',
    @provider = N'SQLNCLI',
    @srvproduct = 'SQLNCLI',
    @provstr = N'SERVER=MyServerName\MyInstanceName;User ID=myUser'

这与我遇到的完全匹配,它解决了我的问题。

更新:请参阅@ Anton's和@ Wouter的替代解决方案的答案。

答案 1 :(得分:2)

作为替代解决方案,您可以使用参数@datasrc而不是@provstr。 @dataSrc无需设置用户ID

即可运行

样品:

EXEC master.dbo.sp_addlinkedserver @server = N'LinkServerName', @provider=N'SQLNCLI',@srvproduct = 'MS SQL Server', @datasrc=N'serverName\InstanceName' 
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName', @locallogin = NULL , @useself = N'False', @rmtuser = N'myUser', @rmtpassword = N'*****'

我也添加了评论here,但它不可见(不知道为什么)。

答案 2 :(得分:1)

在解决此问题之后,我发现可以通过使用User ID而不是@datasrc来避免完全使用@provstr属性。这是非常糟糕的文档,但是下面的示例对我有用:

EXEC master.dbo.sp_addlinkedserver
    @server = 'SOME_NAME',
    @srvproduct='', -- needs to be explicitly empty, default is NULL and is not allowed
    @datasrc='some_server.com\SOME_INSTANCE',
    @provider='SQLNCLI';

-- Set up the Linked server to pass along login credentials
EXEC master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname='SOME_NAME',
    @useself='true', -- Optional. This is the default
    @locallogin=NULL; -- Optional. This is the default

使用此方法,您可以为所有用户重用同一台链接服务器。当前接受的答案有一个巨大的缺点,那就是您需要为每个用户设置一个单独的链接服务器。