现在的位置: 首页 > 综合 > 正文

SQL远程服务器,同步数据触发器

2013年12月14日 ⁄ 综合 ⁄ 共 3819字 ⁄ 字号 评论关闭

 

from:csdn

能否利用触发器操作远程数据库?

------------------------------------------------------------
-----01
------------------------------------------------------------
能/********************链接数据库   *******************************/  
  exec   OPENDATASOURCE(  
                    'SQLOLEDB',  
                    'Data   Source=远程ip;User   ID=sa;Password=密码'  
                    ).库名.dbo.存储过程名  
   
  select   *   into   本地库名..表名   from   OPENDATASOURCE(  
                    'SQLOLEDB',  
                    'Data   Source=远程ip;User   ID=sa;Password=密码'  
                    ).库名.dbo.表名  
   
  insert   本地库名..表名   select   *   from   OPENDATASOURCE(  
                    'SQLOLEDB',  
                    'Data   Source=远程ip;User   ID=sa;Password=密码'  
                    ).库名.dbo.表名  
   
  或使用联结服务器:  
  EXEC   sp_addlinkedserver   '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL   Server};SERVER=远程名;UID=用户;PWD=密码;'  
  exec   sp_addlinkedsrvlogin     @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'  
  GO  
  然后你就可以如下:  
  select   *   from   别名.库名.dbo.表名  
  insert   库名.dbo.表名   select   *   from   别名.库名.dbo.表名  
  select   *   into   库名.dbo.新表名   from   别名.库名.dbo.表名  
  go  

-----------------------------------------------------------------------
------------------------------------------------------------
-----02
------------------------------------------------------------

4 楼zjcxc(邹建)回复于 2004-03-23 09:16:26 得分 30--用触发器即时同步两个表的实例:  
   
  --测试环境: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  
   
  --以下操作在本机进行  
  --在本机上建表及做同步处理的工作  
  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   identity(1,1)   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  
 
Top

5 楼zjcxc(邹建)回复于 2004-03-23 09:17:19 得分 0 --访问不同电脑上的数据库(远程只要联好网就一样)  
   
  --如果经常访问或数据量大,建议用链接服务器  
   
  --创建链接服务器  
  exec   sp_addlinkedserver     'srv_lnk','','SQLOLEDB','远程服务器名或ip地址'  
  exec   sp_addlinkedsrvlogin   'srv_lnk','false',null,'用户名','密码'  
  go  
   
  --查询示例  
  select   *   from   srv_lnk.数据库名.dbo.表名  
   
  --导入示例  
  select   *   into   表   from   srv_lnk.数据库名.dbo.表名  
   
  go  
  --处理完成后删除链接服务器  
  exec   sp_dropserver   'srv_lnk','droplogins'  
 
Top

6 楼zjcxc(邹建)回复于 2004-03-23 09:17:53 得分 0  
  --如果只是临时访问,可以直接用openrowset  
  --查询示例  
  select   *   from   openrowset('sqloled'  
  ,'sql服务器名';'用户名';'密码'  
  数据库名.dbo.表名)  
   
   
  --导入示例  
  select   *   into   表   from   openrowset('sqloled'  
  ,'sql服务器名';'用户名';'密码'  
  数据库名.dbo.表名)  
 

 

 

抱歉!评论已关闭.