如何在链接服务器之间配置身份验证?

时间:2009-01-16 17:25:34

标签: sql-server-2005 tsql transactions distributed-transactions

我正在尝试测试一个概念证明,我可以跨两个链接的SQL Server运行分布式事务,使用sp_addlinkedserver链接它们 - 它们的名称是Server1和Server2,它们都在默认实例下运行。每个服务器分别拥有一个数据库,Source和Destination,目标数据库包含一个名为Output的表,即

Server1.Source
Server2.Destination.Output

OUTPUT表具有以下结构:

OUT_PKEY int identity(1,1) primary key,
OUT_TEXT nvarchar(255)

从Server1我已经调用 sp_addlinkedserver'Server2'来链接这两个数据库,我试图运行以下查询来测试链接是否确实有效:

Select   *
From     Server2.Destination.dbo.Output

我返回以下异常:

  

拒绝访问远程服务器,因为不存在登录映射。

很公道,所以从Server1,我运行 sp_addlinkedsrvlogin'Server2'根据文档说它应该取任何人的用户凭据远程运行查询(即从Server1)并应用那些Server2的凭据。这意味着,由于我使用Windows身份验证连接到Server1,这应该意味着我的Windows凭据也应用于Server2。

现在异常消息变为:

  

用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。

用Google搜索了这个例外,我想出了没有用的东西,指出了我正确的方向。我错过了什么?我希望[如果登录失败]引用我的 Windows凭据,匿名登录凭据的异常。

看起来,一旦我得到链接本身工作,分布式事务本身应该是一个相当简单的事情 - 文档暗示我只需要确保DTC服务在Server1上运行并且任何查询在Server1上运行将通过链接进行交易:

  • 在初始化分布式事务之前包含 SET XACT_ABORT ON
  • 我使用 BEGIN DISTRIBUTED TRANSACTION 代替 BEGIN TRANSACTION
  • 如果我想在Server2上引用SQL Server的非默认实例,我用 [Server2 \ InstanceName] 替换查询中名称​​ Server2 的所有实例

我的问题是这些:

  • 如何解决此登录问题?单独的 sp_addlinkedsrvlogin 存储过程似乎没有做到这一点。
  • 是否确实像文档所暗示的那样简单地运行分布式事务?

TIA

2 个答案:

答案 0 :(得分:1)

如果您在域中,则设置应为“使用登录的当前安全上下文”,但还有一个步骤 - 您需要向事务中涉及的每个服务器授予SPN。 / p>

假设您作为域用户在两台服务器上运行SQL服务(为了使其工作,您需要这样做 - LocalSystem不会这样做),以下是您需要的说明:< / p>

http://technet.microsoft.com/en-us/library/bb735885.aspx

请记住,用户需要两个服务器的SPN,而不是客户端 - 例如,如果您要从客户端访问 - &gt; server1 - &gt; server2,SQL服务帐户将需要服务器1和服务器2的SPN。

如果您感到困惑(这是一个令人困惑的过程),请发表评论,我会澄清说明。

答案 1 :(得分:0)

假设这些服务器都在同一个域上 - 您是否启用了受信任委派以允许您的服务器将凭据传递到目标服务器?您将为服务器提取Active Directory对象,然后转到“委派”选项卡并选择“信任此计算机以仅委派给指定的服务”,然后输入允许服务器将凭据传递到的SQL Server详细信息:

服务类型= MSSQLSvc
用户/计算机= YourTargetServer.Your.Domain
港口= 1433

遗憾的是,链接服务器的许多这些类型的身份验证问题都需要重新启动才能完全生效(因此,如果这些是生产服务器,则很难在白天进行故障排除。)

关于分布式事务 - 如果最终使链接服务器连接正常运行,那么分布式事务可以很好地工作。虽然接下来你可能遇到的一件事就是找到巨大缺陷,你不能使用任何形式的SCOPE_IDENTITY(),@@ IDENTITY等来检索主键将内容插入链接数据库后。但这是另一个有其自身有趣的解决方法的问题......