SQL Server到SQL Server链接的服务器设置

请解释设置SQL Server链接服务器所需的内容。

服务器A是仅SQL 2005的Windowslogin服务器B是相同的(仅SQL 2005的Windowslogin名)

服务器A运行Windows XP Server B运行Windows Server 2003

两个SQL Server服务都在同一个域帐户下运行。 我使用在两个SQL Server上都具有pipe理权限的域帐户login到我的工作站。

请注意,这些都是SQL Server 2005 SP2 – 我已经指出了旧修补程序,但已经应用了这些修补程序。

我遇到的问题是这样的错误:“用户login失败'NT AUTHORITY \ ANONYMOUS LOGON'(Microsoft SQL Server,错误:18456)”

从我对这个问题的理解来看,这是一个“HOP”问题。

即您试图使用服务器A将您的login详细信息(使用SSPI)中继到服务器B.

在SQL Server 2005中,他们增加了一大堆安全问题,这使得这个问题比应该更难。 “Kerberos身份validation”这个词将成为大多数系统pipe理员/ DBA生活的庇护所。 它有效地用于传递身份validation。

这里是你所需要的基础知识。 1)需要在Active Directory(AD)中设置服务器(A和B),并启用Kerberos委派。 (这是通过你的活动目录pipe理面板设置的)

2)你的SQL服务器下运行的服务帐户也需要启用委托(这也是通过你的活动目录pipe理面板设置的)。 – 如果他们没有在服务帐户下运行,则需要创build一个。

3)服务器需要为实例和主机和机器名称定义SPN。 (在Windows支持工具中使用一个名为SetSPN的工具)

支持工具(SetSPN在此设置) http://www.microsoft.com/downloads/details.aspx?FamilyID=96a35011-fd83-419d-939b-9a772ea2df90&DisplayLang=en

(如何添加SPN概述) http://technet.microsoft.com/en-us/library/bb735885.aspx

4)您可能需要将您的数据库设置为“值得信赖”

ALTER DATABASE SET值得信赖

5)完成所有这些后重新启动您的实例。

6)然后尝试再次创build您的链接服务器。

最后你可以testing你与SQL Server的连接。 这应该工作正常,如果你有一切configuration正确。

SELECT * FROM OPENDATASOURCE('SQLNCLI', 'Data Source=ServerB;Integrated Security=SSPI;' ).MASTER.dbo.syscolumns 

这会告诉你你的连接authenticationtypes。

 select auth_scheme from sys.dm_exec_connections where session_id=@@SPID 

你想在这里得到'KERBEROS'而不是'NTLM'。

这是一个滑坡,KERBEROS和传递代表团,坚持下去,你最终会弄清楚。

参考 Kerberos http://blogs.msdn.com/sql_protocols/archive/2005/10/12/479871.aspx

http://blogs.msdn.com/sql_protocols/archive/2006/12/02/understanding-kerberos-and-ntlm-authentication-in-sql-server-connections.aspx

http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/the-biggest-mistake-serviceprincipalname-s.aspx

其他performanceforms的问题http://www.sqlservercentral.com/Forums/Topic460425-359-1.aspx

http://msdn2.microsoft.com/en-us/library/aa905162(sql.80).aspx

http://msdn2.microsoft.com/en-us/library/ms189580.aspx

我希望这一切都有所帮助。

如果您更熟悉GUI,也可以使用SQL Server Management Studio(SSMS)来pipe理\创build链接服务器。 要做到这一点:

  1. 启动SSMS并连接到您要链接的SQL Server实例之一
  2. 在对象浏览器中展开“服务器对象”
  3. 右键单击“Linked Servers”并select“New Linked Server”
  4. 在“新build链接服务器”对话框中,select“SQL Server”作为“服务器types”,然后input要链接到的SQL Server实例。
  5. 在“安全”页面上,select用户从当前服务器到链接服务器的身份validation方式。 您提到两台服务器都设置为使用Windowslogin。 如果是这种情况,在标题为“对于未在上面列表中定义的login名”的部分下,连接将会:“我可能会select标签为”使用login的当前安全上下文“的选项

请注意,这假定在服务器A上login的用户也在服务器B上login

我疯了一样的问题! 我记得2000年这样做总是很容易的。 我一直在谷歌,我无法得到这个工作。 完全相同的设置,两个服务器上运行的域帐户,Windows身份validation。

我试图使用命名pipe道,而不是TCP,至less我得到了一个不同的错误:

 EXEC sp_addlinkedserver @server='statler', @srvproduct='', @provider='SQLNCLI', @datasrc='np:statler', @provstr='Integrated Security=SSPI' -- Then I try this: select net_transport, auth_scheme from statler.master.sys.dm_exec_connections where session_id=@@spid /* Getting closer, but still fails: OLE DB provider "SQLNCLI" for linked server "statler" returned message "Login timeout expired". OLE DB provider "SQLNCLI" for linked server "statler" returned message "An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections.". Msg 5, Level 16, State 1, Line 0 Named Pipes Provider: Could not open a connection to SQL Server [5]. OLE DB provider "SQLNCLI" for linked server "statler" returned message "Invalid connection string attribute". */ 

这可能与启用名称pipe道有关,但是我可以通过sqlcmd从服务器A连接到服务器B,如下所示:

 WALDORF:> Sqlcmd.exe /E /Snp:statler 

如果我不使用命名pipe道,只是:

 New Linked Server Server Type: SqlServer Security: be made using the current login's security context 

我得到这个:

 Login failed for user NT AUTHORITY\ANONYMOUS LOGIN 

[编辑]我开始在这个关于Sql Server Central的讨论。 基本上,您必须做一些与Kerberos委派相关的复杂configuration才能使其工作。

http://www.sqlservercentral.com/Forums/Topic574262-146-1.aspx

我决定创build一个有限的Sqllogin帐户来处理链接的查询。 我讨厌这样做,但它似乎比你必须做的变化,以使其与Windows身份validation工作更安全。

如果你在sp_addlinkedserver和sp_linkedservers上search,你会得到一些例子。 这是非常简单的设置。

另外,如果你有SQLpipe理器,你可以添加它的GUI。

基本上你需要通过Tim提到的SP来连接这两个服务器,或者通过GUI来连接这两个服务器,然后设置访问规则(如果你在两台服务器上都使用Windows身份validation,甚至不需要)。

我知道这应该是容易的,但它根本不适合我 – 我在这里遇到安全问题。 所以我想要有人为我拼出一些步骤。

我过去在SQL 2000上做了这个,没有问题。

所以你可以链接他们,但不能执行查询,因为错误的帐户?

您尝试使用的Windows用户是否有权在两台服务器上读取数据?

一旦我也有问题,因为“数据访问”属性由于某种未知的原因被设置为false。

另外尝试一下,如果你显式设置一个用户到另一个用户的链接会发生什么。

(这些都可以在SQLpipe理器中完成。)

蒂姆已经发布了我认为是正确的步骤。 第5步是安全页面。 我select“使用login的当前安全上下文”。

当我点击确定,我得到以下错误。 我不知道为什么它试图使用“NT Authority \匿名login”。 我使用在两台服务器上都具有所有权限的域帐户login到我的工作站。

TITLE:Microsoft SQL Server Management Studio

“链接的服务器已经创build,但连接testing失败,你想保留链接的服务器?

– – – – – – – – – – – – – – – 附加信息:

执行Transact-SQL语句或批处理时发生exception。 (Microsoft.SqlServer.ConnectionInfo)


用户'NT AUTHORITY \ ANONYMOUS LOGON'login失败。 (Microsoft SQL Server,错误:18456)

要获取帮助,请单击: http : //go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.3068&EvtSrc=MSSQLServer&EvtID=18456&LinkId=20476

尝试在本地login到服务器时执行此操作,如果从远程计算机执行此操作,则可能无法发送正确的凭据。