本帖最后由 nolatiy 于 2015-12-15 18:07 编辑
近段数据库迁移,涉及到创建链接服务器分布式查询时,本以为建立简单的连接就能搞定了,无奈折腾了一整天;
解决过程:
1、就一个简单的存储过程,里面一条插入sql语句,一执行先给个错误:
链接服务器"linkdata"的 OLE DB 访问接口 "SQLNCLI" 该伙伴事务管理器已经禁止了它对远程/网络事务的支持"。
消息 7391,级别 16,状态 2,第 1 行
无法执行该操作,因为链接服务器 "linkdata" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。
2、各种搜以后,原来由于开启了事务,需要分布式事务协调器的支持,先打开控制面板 - 管理工具 - 服务,查看两台服务器上的 Distributed Transaction Coordinator (MSDTC) 服务是否开启,开启后配置两台服务器的事务协调器,具体操作查看附图,我这边两台一个是03一个是08R2,配置有细微差别;
a: 2008R2
08R2 配置
b:2003
03 配置
然后再执行,咣当又一个:
链接服务器"linkdata"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。
消息 7391,级别 16,状态 2,第 1 行
无法执行该操作,因为链接服务器 "linkdata" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。
3、真是醉了,明明已经允许访问,还不限制验证了,怎么还不行?难道两台服务器不在同一域里,使用 nbtstat -a IP命令发现未找到远程服务器主机,
想到是不是需要添加互相信任关系才行?于是修改hosts文件: C:/WINDOWS/system32/drivers/etc/hosts, 在系统目录下找到这个隐藏的hosts系统文件,在文件的末尾加上对方的IP地址和主机名,如192.168.18.86 jobdata(远程服务器名,也可在sql中执行 SELECT @@SERVERNAME得到)
4、这样总可以了吧,满怀期待执行一把居然又蹦出一个:
链接服务器"linkdata"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无法在次会话中启动更多事务。"。
消息 7391,级别 16,状态 2,第 1 行
无法启动链接服务器 "linkdata" 的 OLE DB 访问接口 "SQLNCLI" 的嵌套事务。由于XACT_ABORT选项设置为OFF,因此必须使用嵌套服务
5、好在这次给了提醒,于是在存储过程中做修改,如图:
存储过程修改
6、最后终于执行通过了,但在测试中发现,只有在BEGIN TRANSACTION 中执行时会有这个问题,如果单独执行插入或者查询时不需要添加SET XACT_ABORT ON这句,当然建立了链接时要考虑链接登录账户的权限问题;
又一次踩坑记录,希望帮到更多人,犹如那句话:不懂问人,懂了答人,没人懂问神(MSDN)
|