网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > 入门基础 > 如何通过触发器实现数据库的即时同步-入门基础  

如何通过触发器实现数据库的即时同步-入门基础

2008-04-10  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

    问题:如何通过触发器实现数据库的即时同步?

解答:具体的解决方法请参考下文。

即时同步两个表的示例如下:

测试环境如下:SQL Sever 2000数据库,远程主机名:xz,用户名:sa,密码:无,数据库名:test

创建测试表,请注意不能用标识列做主键,因为不能进行正常的更新。

然后在本机上创建测试表,注意远程主机上也要做同样的建表操作,只是不写触发器。

if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [test]

create table test(id int not null constraint PK_test primary key

,name varchar(10))

go

--创建同步的触发器

create trigger t_test on test

for insert,update,delete

as

set XACT_ABORT on

--启动远程服务器的MSDTC服务

exec master..xp_cmdshell 'isql /S\"xz\" /U\"sa\" /P\"\" /q\"exec master..xp_cmdshell ''net start msdtc'',no_output\"',no_output

--启动本机的MSDTC服务

exec master..xp_cmdshell 'net start msdtc',no_output

--进行分布事务处理,假如表用标识列做主键,你可以使用下面的这个方法

BEGIN DISTRIBUTED TRANSACTION

delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)

where id in(select id from deleted)

insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)

select * from inserted

commit tran

go

--插入数据测试

insert into test

select 1,'aa'

union all select 2,'bb'

union all select 3,'c'

union all select 4,'dd'

union all select 5,'ab'

union all select 6,'bc'

union all select 7,'ddd'

--删除数据测试

delete from test where id in(1,4,6)

--更新数据测试

update test set name=name+'_123' where id in(3,5)

--最后显示测试的结果

select * from test a full join

openrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id 网管联盟bitsCN_com


TAGs   同步   入门   基础   即时   数据库   通过   实现   如何   select   test      
 上一篇:如何使用new_value将查询结果传递给变量-入门基础   下一篇:检测可用性所需要命令为何多于ping命令-入门基础
如何通过触发器实现数据库的即时同步-入门基础 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: