分布式查询

 
前几天做一个分布式查询遇到了一些问题(问题详细描叙见: 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 中测试过,不知道在其他系统会怎么样,还请各位赐教,谢谢!
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值