我正在尝试测试一个概念证明,即我可以在两个链接的 SQL Server 之间运行分布式事务,使用 sp_addlinkedserver 进行链接 - 它们的名称是 Server1 和 Server2,两者都在默认实例下运行。每个服务器分别保存一个数据库,源和目标,目标数据库保存一个名为输出的表,即
Server1.Source
Server2.Destination.Output
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 LOGON”登录失败。
在谷歌上搜索了这个异常后,我没有发现任何有用的东西可以为我指明正确的方向。我缺少什么?我希望[如果登录失败]引用异常myWindows 凭据,not匿名登录凭据。
看起来一旦我让链接本身正常工作,分布式事务本身应该是一件相当简单的事情 - 文档暗示我只需要确保 DTC 服务在 Server1 上运行,并且任何查询在将进行事务处理的 Server1 上运行通过链接:
- Include 设置 XACT_ABORT 为开在初始化我的分布式事务之前
- I use 开始分布式交易代替开始交易
- 如果我希望引用 Server2 上 SQL Server 的非默认实例,我将替换该名称的任何实例Server2在我的查询中[服务器2\实例名称]
我的问题是:
- 我该如何解决这个登录问题?这sp_addlinkedsrvlogin仅存储过程似乎并不能解决问题。
- 运行分布式事务真的像文档所暗示的那么简单吗?
TIA
如果您位于域中,则设置应为“使用登录名的当前安全上下文进行”,但还有一个步骤 - 您需要向事务中涉及的每台服务器授予 SPN。
假设您以域用户身份在两台服务器上运行 SQL 服务(您需要这样做才能完成这项工作 - LocalSystem 不会这样做),以下是您需要的说明:
http://technet.microsoft.com/en-us/library/bb735885.aspx http://technet.microsoft.com/en-us/library/bb735885.aspx
请记住,用户将需要两个服务器的 SPN,但客户端不需要 - 例如,如果您从客户端 -> 服务器 1 -> 服务器 2,SQL 服务帐户将需要服务器 1 和服务器 2 的 SPN。
如果您感到困惑(这是一个令人困惑的过程),请发表评论,我将澄清说明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)