频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源:qqread 作者:佚名 出处:巧巧读书 2008-04-10 进入讨论组
    问题:如何通过触发器实现数据库的即时同步?

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

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

测试环境如下: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

更多文章 更多内容请看数据库专栏数据库处理专题城域网专题专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章