Sql2005,sql2000 跨数据库操作 解决方案

思路:

在本地数据库的表中创建update的触发器,在有数据更新时同时更新远程服务器上得数据库。这需要启用双方服务器上得分布式事务MSDTC服务。

1、在要数据同步更新的表上创建触发器:

Create trigger 触发器名 on 数据表名
for update
as
if update (字段名1) or update (字段名2) or ......
begin
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
update r
set r.字段1=i.字段1,r.字段2=i.字段2
from [远程数据库IP].数据库名.dbo.数据表名 as r inner join inserted i
on r.关联字段=i.关联字段
COMMIT TRAN
end

1、在本地机器上建立远程数据库的链接数据库:

EXEC sp_addlinkedserver '远程数据库IP','SQL Server'
EXEC sp_addlinkedsrvlogin '远程数据库IP','false',null,'访问远程数据库的账号','访问远程数据库的密码'

执行完毕后可以通过查询远程数据库某表来测试一下是否链接建立成功

select top 1 * from [远程数据库IP].数据库名.dbo.数据表名

如果有数据返回则说明链接建立成功。

否则通过以下语句来删除链接后重新建立:

删除链接:

EXEC sp_serveroption ‘远程数据库IP’, 'data access', 'true'
exec sp_droplinkedsrvlogin ‘远程数据库IP’,null
exec sp_dropserver ‘远程数据库IP’

2、启动两个服务器上的MSDTC服务:

 MSDTC(分布式交易协调器),协调跨多个数据库、消息队列、文件系统等资源管理器的事务。该服务的进程名为Msdtc.exe,该进程调用系统Microsoft Personal Web Server和Microsoft SQL Server。该服务用于管理多个服务器 .
位置:控制面板--管理工具--服务--Distributed Transaction Coordinator
依存关系:Remote Procedure Call(RPC)和Security Accounts Manager
建议:一般家用计算机涉及不到,除非你启用Message Queuing服务,可以停止。

解决办法:
(1)在windows控制面版-->管理工具-->服务-->Distributed Transaction Coordinator-->属性-->启动
(2)在CMD下运行"net start msdtc"开启服务后正常。
        注:如果在第1步Distributed Transaction Coordinator 无法启动,则是因为丢失了日志文件,重新创建日志文件,再启动就行了。重新创建 MSDTC 日志,并重新启动服务的步骤如下:
      (1) 单击"开始",单击"运行",输入 cmd 后按"确定"。
      (2) 输入:msdtc -resetlog (注意运行此命令时,不要执行挂起的事务)
      (3) 最后输入:net start msdtc 回车,搞定!

双方电脑做如下配置(windows2003系统):

2. 单击“添加/删除 Windows 组件”。
3. 选择“应用程序服务器”,然后单击“详细信息”。
4. 选择“启用网络 DTC 访问”,然后单击“确定”。
5. 单击“下一步”;单击“完成”。
6. 在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"。
7. 右键“我的电脑”->“属性”,在MSDTC选项卡中,点击“安全配置”按钮。
8. 在安全配置窗口中做如下设置:
 (1)选中“网络DTC访问”
 (2)在客户端管理中选中“允许远程客户端”“允许远程管理”
 (3)在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”
 (4)保证DTC登陆账户为:NT Authority\NetworkService 
 (5)单击"确定"。这样将会提示您"MS DTC 将会停止并重新启动.所有的依赖服务将被停止。请按'是'继续"。单击"是"继续
9. 关闭网络防火墙(或者开放相应的端口135或用services.msc打开服务启动TCP/IP NetBIOS Helper服务)

双方电脑做如下配置(windows2008系统):
2. 单击“控制面板”。
3. 打开“程序和功能”。
4. 单击“打开或关闭windows功能”。
5. 展开“角色”->“应用程序服务器”->“组件服务”->右键“本地DTC”
6. 选择“本地DTC”的“安全选项卡”,做如下设置:
 (1)选中“网络DTC访问”
 (2)在客户端管理中选中“允许远程客户端”“允许远程管理”
 (3)在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”
 (4)保证DTC登陆账户为:NT Authority\NetworkService 
 (5)单击"确定"。这样将会提示您"MS DTC 将会停止并重新启动。所有的依赖服务将被停止。请按'是'继续"。单击"是"继续
7. 关闭网络防火墙(或者开放相应的端口135或用services.msc打开服务启动TCP/IP NetBIOS Helper服务,本人在设定的时候只开通135端口没有起作用,最后还是直接毙掉防火墙才成功)

以上设定完毕后还需要在双方服务器上的C:\windows\system32\drivers\etc\下的hosts文件中添加上双方的IP和计算机名称,如:
192.168.0.5       对方计算机名

如果在本地数据库执行更新语句时出现类似下列错误:
“链接服务器"192.168.0.6"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。
   消息 7391,级别 16,状态 2,第 3 行
   无法执行该操作,因为链接服务器 "192.168.0.6" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。”
说明双方的DTC服务设定还存在问题,按照上面设定步骤再逐一检查。


另外如果本地数据库是高版本的SqlServer(如sql2005),远程数据库是低版本的数据库Sql2000,即便是双方分布式事务启动成功了,在本地执行数据更新时,触发器还会出现如下错误提示:
“链接服务器"192.168.x.x"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。"。
    消息 16955,级别 16,状态 2,第 1 行
    未能创建可接受的游标。”

解决此错误的办法:

在远程Sql2000的数据库上,在要进行同步更新的数据表上加个聚集索引即可解决。

原文地址:https://www.cnblogs.com/wuyifu/p/2875214.html