我正在尝试测试一个概念证明,即我可以在两个链接的 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”登录失败。
在谷歌上搜索了这个异常后,我没有找到任何有用的东西来指引我正确的方向。我错过了什么?我希望 [如果登录失败] 异常引用我的Windows 凭据,而不是匿名登录凭据。
看起来一旦我让链接本身工作,分布式事务本身应该是一件相当简单的事情 - 文档暗示我只需要确保 DTC 服务在 Server1 上运行,并且任何查询都在 Server1 上运行,将被处理通过链接:
- 在初始化我的分布式事务之前包括SET XACT_ABORT ON
- 我使用BEGIN DISTRIBUTED TRANSACTION而不是BEGIN TRANSACTION
- 如果我希望在 Server2 上引用 SQL Server 的非默认实例,我将查询中名称Server2的任何实例替换为[Server2\InstanceName]
我的问题是:
- 我该如何解决这个登录问题?单独的sp_addlinkedsrvlogin存储过程似乎并不能解决问题。
- 运行分布式事务真的像文档所暗示的那样简单吗?
TIA