用触发器实现两个数据库之间相同表的同步

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用触发器实现两个数据库之间相同表的同步

2008-06-13 14:20

近日单位建立OA服务器,要实现两台服务器间数据库表的同步。一开始想采用订阅发布的模式,结果没有成功,连鸣大哥让我想一下怎么解决,结果我从网上找了用触发器实现的方法,觉得这种方法更适合我们的工作要求。OA服务器更新较少,如果采用定时备份的方法会浪费服务器的效率,用触发器就可以在数据库发生变化的时候及时更新两台服务器的数据。

触发器的语法如下:

Trigger on an INSERT, UPDA TE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name

ON { table | view }

[ WITH [ ,...n ] ]

{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME }

::= [ ENCRYPTION ] [ EXECUTE AS Clause ]

::= assembly_name.class_name.method_name

对两个服务器之间的表进行同步,首先要建立链接服务器。

在server1 上创建连接服务器,以便在server1 中操作server2,实现同步

exec sp_addlinkedserver 'server2','','SQLOLEDB','server2的数据库实例名或ip'

exec sp_addlinkedsrvlogin 'server2','false',null,'用户名','密码'

go

trigger的代码如下:假设远程服务器的表是oa_user

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

CREATE TRIGGER Trigger_Add_user

ON [dbo].[oa_user]

AFTER INSERT

AS

BEGIN

SET NOCOUNT ON;

set xact_abort on

insert server2.hdoa.dbo.oa_user

select * from inserted

END

按照网上的攻略所说,建立了上述的触发器,就可以当oa_user表进行插入操作的时候,本地服务器中的表也会有这条记录。

但是在实际实施中,系统报了如下的错误。

服务器: 消息7391,级别16,状态1,行 1

该操作未能执行,因为OLE DB 提供程序'SQLOLEDB' 无法启动分布式事务。

[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。

在网上找了找关于7391的错误还有dtc无法启动的错误描述,发现造成这种情况的的原因很多。

总结解决方法如下:

一、确保MSDTC 服务帐户登录为" 是NetworkService 帐户。

在运行对话框中,输入services.msc然后确定。在服务窗口,找到DistributedTransactionCoordinator服务中检查登陆名为NetworkService 。

错误的情况是:登陆名为本地系统帐户,解决方式如下:

开始, 依次运行。在运行对话框中, 键入cmd然后单击确定。在命令提示符处, 键入Net stop msdtc 要停止MSDTC 服务。在命令提示符处, 键入Msdtc –uninstall 要删除MSDTC。在命令提示符处, 键入regedit 要打开注册表编辑器。在注册表编辑器, 找到以下项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC注册表项。删除该项。退出注册表编辑器。在命令提示符处, 键入Msdtc –install 要安装MSDTC。在命令提示符处, 键入Net start msdtc 要启动MSDTC 服务。

二、启用msdc以允许网络事务。

点击开始-管理工具-组件-组件服务-计算机-我的电脑。右键-属性。

找到msdtc选项。全部选中,验证的地方选择不需验证.最后确定生效。

三、防火墙设定。dtc的端口是135,如果你打开了防火墙,就把135端口设为例外。

四、更改hosts文件(此处注意没有扩展名)

通常在c:\windows\system32\drivers\etc里面。文件参考如下

========================================

# Copyright (c) 1993-1999 Microsoft Corp.

#

# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.

#

# This file contains the mappings of IP addresses to host names. Each

# entry should be kept on an individual line. The IP address should

# be placed in the first column followed by the corresponding host name.

# The IP address and the host name should be separated by at least one

# space.

#

# Additionally, comments (such as these) may be inserted on individual

# lines or following the machine name denoted by a '#' symbol. #

# For example:

#

# 102.54.94.97 # source server

# 38.25.63.10 # x client host

127.0.0.1 localhost

192.168.1.2 中心

192.168.1.3 党政大楼

关键就是最后几行:前面写IP,后面写该电脑的名称。

上面4中情况,我在实施中遇到了第2种和第4种,由于本人小懒了下,把防火墙关闭了,没有测试第3种情况。网上关于hosts文件的说明很少,大多数说明都是关于前3种情况的,看了很多文章,才看见hosts这种情况,貌似是分布式回掉的时候要看本地服务器的电脑名而不是IP,所以在hosts文件要建立一个对应。

终于,两台服务器间不同数据库的表进行复制的问题解决了。

下面所要做的具体工作就是:

1、在每个经常更新的表建立triger.

2、仿照上面的triger写出delete,update这两个triger

然后就可以休息啦。。。哈哈!!!

相关文档
最新文档