4

我想测试一个概念证明,我可以在两个链接的SQL Server上运行分布式事务,使用sp_addlinkedserver进行链接 - 它们的名称是Server1和Server2,两者都在默认实例下运行。每个服务器分别持有一个单一的数据库,源和目的与目标数据库存放名为输出一个表,即如何在链接服务器之间配置身份验证?

Server1.Source 
Server2.Destination.Output 

输出表的结构如下:

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

在Server1我呼吁的sp_addlinkedserver“服务器2”两个数据库链接,我已经尝试运行下面的查询,以测试该链接确实工作:

Select * 
From  Server2.Destination.dbo.Output 

我回到了以下异常:

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

不够公平,所以从Server1上,我跑sp_addlinkedsrvlogin“服务器2”其中根据文件说,它应该采取的任何人远程运行查询的用户凭据(即在Server1),并将这些凭据Server2上。这意味着,由于我使用Windows身份验证连接到Server1,这应该意味着我的Windows身份验证也适用于Server2。

现在异常消息更改为:

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

在谷歌搜索这个例外之后,我没有提出任何有用的信息,指出了我的正确方向。我错过了什么?我期望[如果登录失败]的例外引用我的 Windows凭据,而不是匿名登录凭据。

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

  • 包括SET XACT_ABORT ON之前初始化我的分布式事务
  • 我用BEGIN代替分布式事务 BEGIN TRANSACTION
  • 如果我想引用Server2上的SQL Server的非默认实例,我[Server2上\实例]替换名称Server2上的任何情况下我的查询

我的问题是这些:

  • 如何通过此登录问题? sp_addlinkedsrvlogin单独的存储过程似乎没有办法。
  • 它确实像运行分布式事务一样简单,正如文档所暗示的那样?

TIA

回答

1

如果你在一个域上,那么设置应该是“使用登录的当前安全上下文”,但还有一步 - 你需要授予将SPN分配给交易中涉及的每个服务器。

假设你以域用户的身份在两台服务器上运行SQL服务(为了使其工作 - LocalSystem不需要这么做),下面是您需要的说明:

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

请记住,用户将需要一个SPN两台服务器,而不是客户端 - 例如,如果你是从客户端去 - >服务器1 - >服务器2,SQL服务帐户需要一个SPN为server1和server2。

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

0

假设这些服务器都位于相同的域 - 是否启用信任委派,让您的服务器将凭据传递到目标服务器?您将拉起服务器的Active Directory对象并转到委派选项卡,然后选择“信任此计算机以委托指定的服务”,然后输入服务器允许将凭据传递到的SQL Server详细信息:

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

可悲的是,很多这些类型的身份验证问题与链接的服务器需要重新启动才能完全生效(所以如果这些生产服务器在白天很难排除故障)。

关于分布式事务 - 如果您最终获得连接的服务器连接并正确运行,那么分布式事务工作效果很好。虽然接下来你可能会遇到的一件事情是找到巨大的缺陷,你不能使用任何形式的SCOPE_IDENTITY(),@@ IDENTITY等在插入东西后检索主键链接数据库。但这是另一个问题,它有自己的有趣的解决方法...