Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在链接服务器之间配置身份验证?_Sql Server 2005_Tsql_Transactions_Distributed Transactions - Fatal编程技术网

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

Sql server 2005 如何在链接服务器之间配置身份验证?,sql-server-2005,tsql,transactions,distributed-transactions,Sql Server 2005,Tsql,Transactions,Distributed Transactions,我正在尝试测试一个概念证明,即我可以跨两个链接的SQL Server运行分布式事务,使用sp_addlinkedserver链接-它们的名称是Server1和Server2,都在默认实例下运行。每个服务器分别持有一个数据库、源数据库和目标数据库,目标数据库持有一个名为Output的表,即 Server1.Source Server2.Destination.Output 输出表具有以下结构: OUT_PKEY int identity(1,1) primary key, OUT_TEXT nv

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

Server1.Source
Server2.Destination.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_addLinkedServLogin“Server2”,根据文档,它应该获取远程运行查询的人(即从Server1)的用户凭据,并将这些凭据应用于Server2。这意味着,由于我使用Windows身份验证连接到服务器1,这意味着我的Windows凭据也应用于服务器2

现在,异常消息更改为:

用户“NT授权\匿名登录”登录失败

在谷歌搜索了这个例外之后,我没有找到任何有用的东西来为我指明正确的方向。我错过了什么?我希望[如果登录失败]异常引用我的Windows凭据,而不是匿名登录凭据

看起来,一旦我让链接本身正常工作,分布式事务本身应该是一件相当简单的事情-文档表明,我只需要确保DTC服务在Server1上运行,并且在Server1上运行的任何查询都将通过链接进行处理:

  • 在初始化分布式事务之前包括设置XACT_ABORT ON
  • 我使用BeginDistributedTransaction而不是BeginTransaction
  • 如果我希望引用Server2上SQL Server的非默认实例,我会将查询中名称Server2的任何实例替换为[Server2\InstanceName]
我的问题是:

  • 我如何克服这个登录问题?单是sp_addlinkedsrvlogin存储过程似乎并没有起到作用
  • 运行分布式事务真的像文档所暗示的那样简单吗

TIA

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

服务类型=MSSQLSvc
用户/计算机=您的targetserver.Your.Domain
端口=1433

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


关于分布式事务,如果您最终能够建立链接服务器连接并正确运行,那么分布式事务将非常有效。尽管下一件事可能会在你开始工作后遇到,那就是发现一个巨大的缺陷,在将某些东西插入链接数据库后,你不能使用任何形式的SCOPE_IDENTITY(),@@IDENTITY等来检索主键。但这是另一个有趣的解决方法问题…

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

假设您以域用户的身份在两台服务器上运行SQL服务(您需要这样做才能使其正常工作—LocalSystem不会这样做),以下是您需要的说明:

请记住,用户将需要两台服务器的SPN,而不是客户端—例如,如果您从client->server1->server2开始,SQL服务帐户将需要server1和server2的SPN

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