数据同步,可以用触发器来实现

来源:互联网 发布:yy隐身软件 编辑:程序博客网 时间:2024/05/02 04:46

--====================================================
--发布/订阅的效果最好.  
--自己写触发器同步的实时性和可控制性最好.
--====================================================


--如果只是简单的数据同步,可以用触发器来实现.下面是例子:  
   
  --测试环境:SQL2000,远程主机名: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';'',testdb.dbo.test)  
  where   id   in(select   id   from   deleted)  
  insert   into   openrowset('sqloledb','xz';'sa';'',testdb.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  
   
 

原创粉丝点击