SQL 链接服务器 returns 错误 "no login-mapping exists" 使用非管理员帐户时

SQL Linked Server returns error "no login-mapping exists" when non-admin account is used

我有一个本地 SQL Server 2008R2。我已将链接服务器配置为远程数据库。

当我使用具有 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 登录帐户配置什么样的安全性才能使用链接服务器?

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

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

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

这完全符合我遇到的情况,解决了我的问题。

作为替代解决方案,您可以使用参数@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,但它不可见(不知道为什么)。

在尝试了这个之后,我发现您可以通过使用 @datasrc 而不是 @provstr 来完全避免使用 User ID 属性。这没有很好的记录,但下面的例子对我有用:

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

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

您也可以通过 right-clicking 在您的远程服务器 -> 属性 -> 安全 -> 添加

添加远程服务器登录映射