我有一个本地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登录帐户配置哪种安全性才能使用链接服务器?
答案 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
使用此方法,您可以为所有用户重用同一台链接服务器。当前接受的答案有一个巨大的缺点,那就是您需要为每个用户设置一个单独的链接服务器。