急急急,请教高手在SQL server中如何用触发器实现两个不同服务器上的相同数据库表的数据同步?
本帖最后由 hxy825 于 2013-04-14 12:36:26 编辑
现在在同一局域网内有Srv1和Srv2两台服务器,都安装有数据库SQL server2000,两个数据库中都建立了相同的数据库“test”,并且都有一个相同的“table1”表,如何写SQL server触发器来实现当Srv1服务器中的“table1”表数据发生变化时Srv2服务器中的“table1”表也能跟着变以实现两个数据表同步呢?“table1”表结构为:create table table1(DJBH int identity,DJJE numeric(19,2))。我的处理步骤是:
1、--在A服务器上建立B服务器连接
exec sp_addlinkedserver 'Srv2','','SQLOLEDB','test'
exec sp_addlinkedsrvlogin 'Srv2','false',null,'sa',''
go
2、在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
3、创建同步处理触发器
if (object_id('Trigger1', 'TR') is not null) drop trigger Trigger1
go
create trigger Trigger1 ON table1
after insert
as
begin
set xact_abort on --如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
set nocount on
set insert Srv2.test.table1(DJBH,DJJE)
select DJBH,DJJE from inserted
end
可是我试验的执行:insert into table1(DJBH, DJJE) values(1, 100) 后总是提示“对象名Srv2.test.table1”无效呢,有劳高手们指点一下到底是哪里出现问题了呢?谢谢
------解决方案--------------------把“Srv2.test.table1”改成“Srv2.test.dbo.table1”试试
------解决方案--------------------我感觉触发器是一个很不好的选择,
特别是跨服务器的。更重要的是你的数据是SQL server 2000。
你要了解出触发器执行的原理.
SQL server 2000 的时候还没有行版本控制技术。
所以他的触发器一点都不成熟。他是通过逆序扫描日志来。
也就是我磁盘的磁头在滋滋滋的往前写入的时候。你突然就往回去读。
这会影响数据库性能。一个事务提交唯一往磁盘里写的东西就是日志。这样也会影响后续事务的提交时间
SQL server 2005 及以上版本。通过行版本控制技术。其原理大概就是每个事务都有自己的事务id,
通过事务id把行的另一个版本放在TEMPDB 的存储区域里维护。也就是不会再逆序扫描日志了。但是你要
更重视你的TEMPDB了。有可能一个很大的事务就能把你TEMP搞到10几个G那么大。也会越来越重视TEMPDB的性能问题。
所以如果你的同步不要求实时性,你可以根据某一列(主键,唯一标示都行)把数据抽取过来。
忘能帮助你。