前几天做一个分布式查询遇到了一些问题(问题详细描叙见:
http://www.cnblogs.com/lizhiwen/archive/2007/08/24/868141.html),
经过反复查找,总算是找到了问题所在。下面就说一下大致过程:
环境:
服务器
Service A
,
Service B
,
Service A
安装的
win2003
,
Service B
安装的
win xp sp3
。
两台服务器都是装的
sql server 2000, A
和
B
在同一个局域网内
.
有两个存储过程
ProcA
,
ProcB
,存储过程都在
Service A
上,其中
ProcB
中有查询
Service B
数据库中表数据语句(只有查询操作)
一、
创建分布式存储过程
如果之前
Service A
没有连接过
Service B
,那么创建
Proc B
时会提示如下错误:
Could not find server 'Service B' in sysservers. Execute sp_addlinkedserver to add the server to sysservers.
这是提示你首先在
Service
A中创建一个
ServiceB
的连接。使用
sql
语句,如下
USE master
GO
EXEC sp_addlinkedserver 'Service B',N'SQL Server'
GO
EXEC sp_addlinkedsrvlogin 'Service B', 'false', NULL, '
用户名
', '
密码
'
运行完上面的语句后,再创建
Proc B
,这时又出现了另外一个错误:
---------------------------
Microsoft SQL-DMO (ODBC SQLState: 42000)
---------------------------
Error 7405: Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
---------------------------
OK
---------------------------
原来设置用于分布式查询的 SQL-92 选项,必须先将连接的 ANSI_NULLS 和 ANSI_WARNINGS 选项打开,然后才能执行分布式查询。如下:
Set ANSI_NULLS ON
Set ANSI_WARNINGS ON
Create procedure ProcB
……
这样分布式查询的存储过程就创建好了。
该存储过程只能在查询分析器中创建。
二、
测试存储过程
开始测试存储过程,先单独测试ProcB,第一次没有通过,报找不到数据库。原来是Service B的防火墙打开了,把防火墙关掉后,再运行ProcB,结果正常,测试通过。
再运行ProcA,又出问题了,报一个这样的错误:
The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.
[OLE/DB provider returned message: New transaction cannot enlist in the specified transaction coordinator. ]
OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].
经过从网上查找和反复测试,终于发现了问题所在。问题出在了分布式事务上面。
l
当单独运行
ProcB
时,只是简单的查询,所以不会打开分布式事务。
l
当去掉
ProcA
中的
Insert
语句也能成功,原因是这样也不会打开分布式事务。
l
而一用上
Insert
语句,就必须打开分布式事务,而这时
ServiceB
并不支持分布式事务,所以报出了上面的错误。
这时就必须对
ServiceB
进行一些设置:
1.
虽然关掉了防火墙,但是还必须把分布式程序和端口加上。具体操作:
在防火墙操作界面有一个
Add program
按钮,点击该按钮添加
C:/WINDOWS/system32/msdtc.exe
文件;然后再点击
Add Port
按钮,添加
135
端口。
2.
打开
Control Panel - Administrative Tools--Component Services,
在打开的窗口中选择
Component Services—computer – my computer.
然后再
my computer
上点击右键选
properties,
在弹出的对话框中选标签头
MSTDC---Security Configuration,
按照如下进行勾选:

然后点击确定,再重启分布式事务服务,再运行 ProcA 就 OK 了。
到这基本上就
OK
了,由于没时间,我只是在
win xp
中测试过,不知道在其他系统会怎么样,还请各位赐教,谢谢!