使用MSDTC链接服务器错误

时间:2009-01-10 13:25:22

标签: sql sql-server stored-procedures linked-server msdtc

我正在通过互联网在两个系统之间使用“链接服务器”显示数据事务存储过程的示例

Alter Proc [dbo].[usp_Select_TransferingDatasFromServerCheckingforExample]

@RserverName varchar(100), ----- Server Name  
@RUserid Varchar(100),           ----- server user id
@RPass Varchar(100),              ----- Server Password 
@DbName varchar(100)           ----- Server database    

As
Set nocount on
Set Xact_abort on
Declare @user varchar(100)
Declare @userID varchar(100)
Declare @Db Varchar(100)
Declare @Lserver varchar(100)
Select @Lserver = @@servername
Select @userID = suser_name()
select @User=user
Exec('if exists(Select 1 From [Master].[' + @user + '].[sysservers] where srvname = ''' + @RserverName + ''') begin Exec sp_droplinkedsrvlogin ''' +  @RserverName + ''',''' + @userID + ''' exec sp_dropserver ''' + @RserverName + ''' end ')


set @RserverName='['+@RserverName+']'
declare @ColumnList varchar(max)
set @ColumnList = null
select  @ColumnList = case when @ColumnList is not null then @ColumnList + ',' + quotename(name) else quotename(name) end  from syscolumns where id = object_id('bditm') order by colid
set identity_insert Bditm on
exec ('Insert Into Bditm ('+ @ColumnList +') Select * From '+ @RserverName + '.'+ @DbName + '.'+ @user + '.Bditm')
set identity_insert Bditm off

set @RserverName=replace(replace(@RserverName,'[',''),']','')

Exec sp_droplinkedsrvlogin  @RserverName,@userID
Exec sp_dropserver @RserverName

当我运行存储过程时我在不同的执行时间内获取不同的错误

一段时间显示此错误

"The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ServerName" was unable to begin a distributed transaction."

另一次显示此类型的错误

OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Protocol error in TDS stream".
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical connection is not usable [xFFFFFFFF]. 
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical connection is not usable [xFFFFFFFF]. 
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 10054, Level 16, State 1, Line 0
TCP Provider: An existing connection was forcibly closed by the remote host.

我在客户端和Windows Server 2003中使用Windows Xp和SQL Server 2005以及在Net Server中使用Sql server 2005

我在两个系统中设置MSDTC

如何解决此问题(并提供有关在Windows XP和Windows Server 2003中设置MSDTC的正确信息)

5 个答案:

答案 0 :(得分:1)

我同意上述帖子,它可能是协议问题,但可能需要使用命名管道作为接口。

或者可能是DTC服务运行的用户帐户只具有本地权限,并且没有网络权限。在两台计算机上使用具有足够权限的域帐户来运行DTC。

或者您可能需要在流程的前端使用BEGIN DISTRIBUTED TRANSACTION启动分布式事务。

答案 1 :(得分:1)

答案 2 :(得分:1)

我可以确认这是一个网络连接问题。我以前见过这个。

MSDTC代理必须能够连接到他们正在协调的所有数据库实例。

有一些经过MS认证的程序用于测试... google for msdtc ping。

答案 3 :(得分:1)

您还必须检查IP网络配置中的DNS名称解析。

例如,您有一个名为 server-a.mydomain.com 的服务器和另一个名为 server-b.otherdomain.com 的服务器,请登录 server-a 并执行 ping server-b (没有域名)。

如果它响应“ Ping请求找不到主机服务器-b。请检查名称并重试。”这就是问题所在。

转到控制面板>网络连接>右键单击网卡>属性>网络协议>属性>高级> DNS>按顺序附加此DNS后缀。在此处添加本地域: mydomain.com ,然后添加远程域: otherdomain.com 。单击“确定”直到退出

现在如果您执行 ping server-b ,它应该响应如下:

使用32个字节的数据ping server-b.otherdomain.com [192.168.1.2]: 来自192.168.1.2的回复:bytes = 32 time = 12ms TTL = 64 来自192.168.1.2的回复:bytes = 32 time = 9ms TTL = 64

现在再次尝试执行分布式事务。

答案 4 :(得分:0)

一个很长的镜头,但我在MSSQL Server 7上遇到了类似的问题。事实证明,两个系统都需要通过NetBios名称相互联系,因为它们不是域的一部分(但是像你的情况一样通过WAN进行通信。)

一个简单的解决方案,至少要检查是否是这种情况,将编辑lmhosts文件以映射每个IP地址的计算机名称(在客户端和服务器中)。

看到我回复的一些有点困惑的帖子: http://groups.google.com/group/microsoft.public.sqlserver.server/browse_thread/thread/2c246bd2afc7c4d9