SQL Server至SQL Server链接服务器设置


25

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

服务器A是仅SQL 2005 Windows登录名服务器B是相同的(仅SQL 2005 Windows登录名)

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

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

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

我遇到的问题是以下错误:“用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。(Microsoft SQL Server,错误:18456)”

Answers:


18

根据我对这个问题的了解,这是一个“ HOP”问题。

也就是说,您正在尝试使用服务器A将您的登录详细信息(通过SSPI)中继到服务器B。

在SQL Server 2005中,他们添加了很多安全问题,这使它比应有的难度更大。“ Kerberos身份验证”一词将成为大多数sys-admins / DBA生活的祸根。它有效地用于通过身份验证。

这是您需要的基本知识。1)需要在Active Directory(AD)中设置服务器(A和B),并启用Kerberos授权。(这是通过您的活动目录管理面板设置的)

2)您的SQL Server运行的服务帐户也需要启用委派(也可以通过活动目录管理面板设置)。-如果它们不在服务帐户下运行,则需要创建一个。

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/zh-cn/library/bb735885.aspx

4)您可能需要将数据库设置为“可信任”

ALTER DATABASE SET值得信赖

5)完成所有这些操作后,重新启动实例。

6)然后尝试再次创建链接服务器。

最后,您可以测试与SQL Server的连接。如果所有配置正确,这应该可以正常工作。

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

这将告诉您您的连接身份验证类型。

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

您想在这里获得“ KERBEROS”,而不是“ NTLM”。

这是一个湿滑的斜坡,使用KERBEROS和Pass-through委派,坚持下去,您最终会发现它的。

参考 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

问题的其他表现形式 http://www.sqlservercentral.com/Forums/Topic460425-359-1.aspx

http://msdn2.microsoft.com/zh-CN/library/aa905162(sql.80).aspx

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

希望对您有帮助。


好答案!这肯定总结了在其他地方没有有用组织的大量信息。
2013年

3

如果您更熟悉GUI,也可以使用SQL Server Management Studio(SSMS)来管理\创建链接的服务器。为此:

  1. 启动SSMS并连接到要链接的SQL Server实例之一
  2. 在对象资源管理器中展开“服务器对象”
  3. 右键单击“链接服务器”,然后选择“新链接服务器”
  4. 在“新链接的服务器”对话框上,选择“ SQL Server”作为“服务器类型”,然后输入要链接到的SQL Server实例。
  5. 在“安全性”页面上,选择用户如何从当前服务器到链接服务器进行身份验证。您提到两个服务器都设置为使用Windows登录名。如果是这种情况,在“对于上面列表中未定义的登录名”部分下的连接将::我可能会选择“使用登录名的当前安全上下文进行连接”选项

请注意,这假设在服务器A上登录的用户也在服务器B上登录。


1

我疯了同样的问题!我记得用2000做到这一点总是很容易。我已经遍及谷歌了,我无法使它工作。完全相同的设置,两个服务器都运行在域帐户Windows auth上。

我正在尝试使用命名管道而不是TCP,至少我遇到了另一个错误:

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".

*/

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

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

如果我不使用命名管道,请执行以下操作:

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委派有关的复杂配置,才能使其工作。

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

我决定只创建一个有限的SQL登录帐户来处理链接的查询。我讨厌诉诸于此,但它似乎比为了使其与Windows Auth一起使用而必须进行的更改更为安全。


有关复杂的Kerberos设置,请参见下文。这些东西杀死了我很久很久了!
evilhomer

0

如果在sp_addlinkedserver和sp_linkedservers上进行搜索,则会得到一些示例。设置非常简单。


0

另外,如果您具有SQL Manager,则可以添加其GUI。

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


0

我知道这应该很容易,但是对我来说根本不起作用-我在这里遇到安全问题。因此,我希望有人为我阐明步骤。

我过去在SQL 2000上做到了这一点,没有任何问题。


0

因此,您可以链接它们,但由于帐户错误而无法执行查询?

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

有一次我也遇到了一个问题,因为出于某些未知的原因,“数据访问”属性被设置为false。

如果您将一个用户显式设置为该链接的另一个用户,也请尝试一下会发生什么。

(这些都可以在SQL Manager中完成。)


0

蒂姆张贴了我认为正确的正确步骤。步骤5是安全性页面。我选择“使用登录名的当前安全上下文进行”。

单击确定时,出现以下错误。我不知道为什么要尝试使用“ NT Authority \匿名登录”。我使用我的域帐户登录到我的工作站,该域帐户在两台服务器上均具有所有权利。

标题:Microsoft SQL Server Management Studio

“已创建链接服务器,但连接测试失败。是否要保留链接服务器?”

- - - - - - - - - - - - - - - 附加信息:

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


用户“ NT AUTHORITY \ ANONYMOUS LOGON”的登录失败。(Microsoft SQL Server,错误:18456)

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.