通过触发器实现数据库的即时同步

该博客为转载内容,转载自https://www.cnblogs.com/ghd258/archive/2005/10/24/260783.html ,涉及数据库相关信息。
None.gif---即时同步两个表的实例: 
None.gif--
测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test
None.gif

None.gif
--创建测试表,不能用标识列做主键,因为不能进行正常更新
None.gif--
在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器
None.gif
if exists (select * from dbo.sysobjects where id = object_id(N'[test]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
None.gif
drop table [test]
None.gif
None.gif
create table test(id int not null constraint PK_test primary key
None.gif ,name 
varchar(10))
None.gif
go
None.gif
None.gif
--创建同步的触发器
None.gif
create trigger t_test on test
None.gif
for insert,update,delete
None.gif
as
None.gif
set  XACT_ABORT on
None.gif
--启动远程服务器的MSDTC服务
None.gif
exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output
None.gif
None.gif
--启动本机的MSDTC服务
None.gif
exec master..xp_cmdshell 'net start msdtc',no_output
None.gif
None.gif
--进行分布事务处理,如果表用标识列做主键,用下面的方法
None.gif
BEGIN DISTRIBUTED TRANSACTION
None.gif
delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
None.gif 
where id in(select id from deleted)
None.gif
insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)
None.gif 
select * from inserted
None.gif
commit tran
None.gif
go
None.gif
None.gif
--插入数据测试
None.gif
insert into test
None.gif
select 1,'aa'
None.gif
union all select 2,'bb'
None.gif
union all select 3,'c'
None.gif
union all select 4,'dd'
None.gif
union all select 5,'ab'
None.gif
union all select 6,'bc'
None.gif
union all select 7,'ddd'
None.gif
None.gif
--删除数据测试
None.gif
delete from test where id in(1,4,6)
None.gif
None.gif
--更新数据测试
None.gif
update test set name=name+'_123' where id in(3,5)
None.gif
None.gif
--显示测试的结果
None.gif
select * from test a full join
None.gif
openrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id
None.gif

转载于:https://www.cnblogs.com/ghd258/archive/2005/10/24/260783.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值