我有一个本地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登录帐户,使用链接的服务器什么样的安全性?
据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'
这完全符合我曾经遇到过什么,它解决了我的问题。
UPDATE:见@安东的和@沃特的答案替代解决方案。
作为替代的解决方案,你可以使用参数,而不是@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,也不过是不可见的(不知道为什么)。
与此玩耍后,我发现,你可不必完全使用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
使用这种方法,你可以重用为所有用户的同一链接服务器。目前公认的答案有你需要建立一个单独的链接服务器为每个用户的巨大缺陷。