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 在您的远程服务器 -> 属性 -> 安全 -> 添加
添加远程服务器登录映射
我有一个本地 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 在您的远程服务器 -> 属性 -> 安全 -> 添加
添加远程服务器登录映射