只能通过管理员查看链接服务器上的表。不是SQL服务器用户

时间:2016-07-25 10:26:56

标签: sql-server sql-server-2012 linked-server

我有两个数据库服务器。一个在办公室计算机上,一个在网络服务器上。通过互联网在两台计算机之间存在安全的加密隧道。 已在webserver pc上设置SQL Server用户,以允许访问我需要的表。

在办公室电脑上有一个本地帐户需要访问这些链接表。

在计算机之间设置链接服务器。从SQL Server Management Studio中的sysadmin界面,我可以在链接服务器上随意浏览表。

但如果我以SQL Server用户身份登录并尝试测试连接

===================================

The test connection to the linked server failed.

===================================

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------
Program Location:

   at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)
   at Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(String cmd)
   at Microsoft.SqlServer.Management.Smo.LinkedServer.TestConnection()
   at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.LinkedServerConnectionTest.Invoke()

===================================

Access to the remote server is denied because no login-mapping exists. (.Net SqlClient Data Provider)

------------------------------
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.5058&EvtSrc=MSSQLServer&EvtID=7416&LinkId=20476

------------------------------
Server Name: SERVER\INSTANCE
Error Number: 7416
Severity: 16
State: 2
Procedure: sp_testlinkedserver
Line Number: 1


------------------------------
Program Location:

   at Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException)
   at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)

到目前为止我尝试了什么

  • 将本地和远程用户详细信息添加到“链接服务器属性”窗口。
  • 添加默认安全上下文“使用此安全上下文”

如何设置它以便SQL Server用户可以使用链接服务器?

1 个答案:

答案 0 :(得分:0)

问题在于需要在远程连接字符串中定义用户ID。

来自https://blogs.technet.microsoft.com/mdegre/2011/03/10/access-to-the-remote-server-is-denied-because-no-login-mapping-exists/

  

原因:使用参数@provstr和创建链接服务器时   您使用本地SQL Server非管理员或非Windows帐户   将参数“User Name”添加到@provstr

中      

解决方案:将“用户ID =用户名”添加到您的提供商字符串中   链接服务器

     

EXEC master.dbo.sp_addlinkedserver @server = N'LinkServerName',   @ provider = N'SQLNCLI',@ srvproduct ='MS SQL Server',   @ provstr = N'SERVER = serverName \ InstanceName;用户ID = myUser'

     

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName',   @locallogin = NULL,@ useself = N'False',@ rmtuser = N'myUser',   @rmtpassword = N'*****'

总的来说,我的设置字符串看起来像这样(有关通过互联网设置连接的额外细节。

EXEC master.dbo.sp_addlinkedserver @server = N'LINKEDSERVERNAME', @srvproduct=N'SQL_SERVER', @provider=N'SQLNCLI', @provstr=N'SERVER=SERVER\INSTANCE;User ID=webuser', @datasrc=N'www.domain.com'

小注意,我的网络服务器没有实例名称,因此我将“\ INSTANCE”部分从连接字符串构建中删除。

注2:文档说明@srvproduct ='MS SQL Server',但我的2012 sql server只接受SQL_SERVER。