[转]SQL2008链接服务器数据同步

 

  
  
  
  
  1. -- 删除链接和链接服务器   
  2. Exec sp_droplinkedsrvlogin syncDB,Null   
  3. Exec sp_dropserver syncDB   
  4.    
  5. EXEC sp_addlinkedserver   
  6.       @server='syncDB',--被访问的服务器别名   
  7.       @srvproduct='',   
  8.       @provider='SQLOLEDB',   
  9.       @datasrc='202.**.***.43\MSSQLSERVER2008' --要访问的服务器实例名   
  10.    
  11. ---- @datasrc='servername\instancename'   
  12. ---- servername 是运行 SQL Server 的计算机名称(或者IP),instancename 是用户将被连接到的特定 SQL Server 实例的名称   
  13.     
  14. EXEC sp_addlinkedsrvlogin   
  15.      'syncDB'--被访问的服务器别名   
  16.      'false',   
  17.      NULL,   
  18.      'sa'--帐号   
  19.      'sa' --密码   
  20.         
  21. exec sp_serveroption 'syncDB43','rpc out','true';  --允许调用链接服务器上的存储过程   
  22.        
  23. -- 在远程服务器43的作业中调用本服务器的存储过程saveSync_process_ON187        
  24. --exec('exec Mydb_sync187.dbo.saveSync_process_ON187') at syncDB43;   
  25.    
  26. **/   
  27.    
  28. /*--链接服务器同步数据示例    
  29.    
  30. 服务器HAI:   
  31.        hostname:HAI   
  32.        实例名:HAI\BRUCESERVER      
  33.       (测试)数据库名:Mydb_sync187    
  34.           
  35. 服务器CHOW:          
  36.        hostname:CHOW   
  37.        实例名:CHOW\SQL2008       
  38.       (测试)数据库名:Mydb_sync10    
  39.    
  40. 同步要求:   
  41. 、在服务器HAI在的My_sync187数据库出现save、updatedelete操作后,将数据同步到服务器CHOW的Mydb_sync10数据库中,保持数据一致性。   
  42. 、在服务器CHOW在的Mydb_sync10数据库出现save、updatedelete操作后,将数据同步到服务器HAI的Mydb_sync187数据库中,保持数据一致性。   
  43. --*/    
  44.    
  45. /*   
  46. -- 在服务器HAI上完成save、update、delete操作后将数据单向同步到服务器CHOW上的设置如下列步骤所示(在服务器CHOW的设置相似)   
  47. */   
  48.    
  49. --步骤1:在服务器HAI上创建链接服务器(链接到服务器CHOW,202.**.***.10):    
  50. -------   
  51. Exec sp_droplinkedsrvlogin syncDB10,Null   
  52. Exec sp_dropserver syncDB10   
  53. EXEC sp_addlinkedserver   
  54.       @server='syncDB10',--被访问的服务器别名   
  55.       @srvproduct='',   
  56.       @provider='SQLOLEDB',   
  57.       @datasrc='202.**.***.10\SQL2008' --要访问的服务器   
  58.     
  59. EXEC sp_addlinkedsrvlogin   
  60.      'syncDB10'--被访问的服务器别名   
  61.      'false',   
  62.      NULL,   
  63.      'sa'--帐号   
  64.      'sa' --密码   
  65.    
  66.    
  67.    
  68. --步骤2:在服务器HAI上启动 msdtc(分布式事务处理服务),并且设置为自动启动    
  69.    
  70. --  我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动    
  71. --  注:如果在第1步Distributed Transaction Coordinator 无法启动,则是因为丢失了日志文件,重新创建日志文件,再启动就行了。重新创建 MSDTC 日志,并重新启动服务的步骤如下:   
  72. --    (1) 单击"开始",单击"运行",输入 cmd 后按"确定"。   
  73. --    (2) 输入:msdtc -resetlog (注意运行此命令时,不要执行挂起的事务)   
  74. --    (3) 最后输入:net start msdtc 回车。   
  75.    
  76.    
  77. --步骤3: 在服务器HAI上的数据库Mydb_sync187 创建一个作业定时远程调用服务器CHOW数据库Mydb_sync10上的同步处理存储过程。   
  78.    
  79. --  企业管理器    
  80. --  管理    
  81. --  SQL Server代理    
  82. --  右键作业    
  83. --  新建作业    
  84. --  "常规"项中输入作业名称,如 Mydb_sync187_job    
  85. --  "步骤"项    
  86. --   新建    
  87. --  "步骤名"中输入步骤名,如 Mydb_sync187_step    
  88. --  "类型"中选择"Transact-SQL 脚本(TSQL)"    
  89. --  "数据库"选择执行命令的数据库,如 Mydb_sync187    
  90. --  "命令"中输入要执行的语句:    
  91.    
  92.     EXEC sp_addlinkedserver   
  93.       @server='syncDB10',--被访问的服务器别名   
  94.       @srvproduct='',   
  95.       @provider='SQLOLEDB',   
  96.       @datasrc='202.**.***.10\SQL2008'--要访问的服务器   
  97.     
  98.     EXEC sp_addlinkedsrvlogin   
  99.      'syncDB10'--被访问的服务器别名   
  100.      'false',   
  101.       NULL,   
  102.      'sa'--帐号   
  103.      'sa'--密码   
  104.       
  105.     --允许调用链接服务器syncDB10上的存储过程   
  106.     EXEC sp_serveroption 'syncDB10','rpc out','true';     
  107.     
  108.     EXEC('exec Mydb_sync10.dbo.saveSync_process_ON10'at syncDB10;   
  109.     EXEC('exec Mydb_sync10.dbo.updateSync_process_ON10'at syncDB10;   
  110.     EXEC('exec Mydb_sync10.dbo.deleteSync_process_ON10'at syncDB10;   
  111.    
  112.     Exec sp_droplinkedsrvlogin syncDB10,Null;   
  113.     Exec sp_dropserver syncDB10;    
  114.        
  115. --  确定    
  116. --  "调度"项    
  117. --  新建调度    
  118. --  "名称"中输入调度名称    
  119. --  "调度类型"中选择你的作业执行安排    
  120. --  如果选择"反复出现"    
  121. --  点"更改"来设置你的时间安排 (设置合理的时间安排)   
  122.    
  123.    
  124. --  然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行    
  125. --  设置方法:    
  126. --  我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.    
  127.    
  128. --步骤4:在服务器HAI上调用服务器CHOW上的实现同步处理的存储过程如下    
  129.    
  130. --  服务器CHOW上Mydb_sync10数据库中创建如下的同步处理存储过程:    
  131. GO   
  132. --新增数据操作存储过程   
  133. create proc saveSync_process_ON187    
  134. as   
  135. begin tran --开始事物   
  136.    
  137. --将远程服务器新增的数据同步到本服务器中    
  138. insert t_park_account(status,user_id,car_id,cardNo,cardType,cost,lowestBalanceAfterConsume,tollyLowestBalanceAC,noEntryBalance,lowBalanceNotice,openAccountTime,statusUpdateTime,remark,parkNo,balance)    
  139.     select status,user_id,car_id,cardNo,cardType,cost,lowestBalanceAfterConsume,tollyLowestBalanceAC,noEntryBalance,lowBalanceNotice,openAccountTime,statusUpdateTime,remark,parkNo,balance    
  140.     from syncDB187.Mydb_sync187.dbo.t_park_account _account   
  141.     where not exists(    
  142.                     select * from t_park_account where sys_id=_account.sys_id)   
  143.                     
  144. --@@error的值不等于0表示上一条SQL语句执行结果有错,即采取事物回滚措施   
  145. if @@ERROR<>0    
  146. begin   
  147.     rollback tran   
  148. end   
  149.    
  150. insert t_park_user(sys_id,userName,credentialsType,credentialsNo,phone,mobileNumber,address)    
  151.     select sys_id,userName,credentialsType,credentialsNo,phone,mobileNumber,address    
  152.     from syncDB187.Mydb_sync187.dbo.t_park_user _user   
  153.     where not exists(    
  154.                     select * from t_park_user where sys_id=_user.sys_id)   
  155.    
  156. if @@ERROR<>0    
  157. begin   
  158. rollback tran   
  159. end   
  160.    
  161. insert t_park_car(vehPlate,carType,carColour)    
  162.     select vehPlate,carType,carColour    
  163.     from syncDB187.Mydb_sync187.dbo.t_park_car _car   
  164.     where not exists(   
  165.                     select * from t_park_car where sys_id=_car.sys_id)   
  166.                                        
  167. if @@ERROR<>0    
  168. begin   
  169. rollback tran   
  170. end   
  171.    
  172. commit tran --提交事物   
  173.    
  174.    
  175. GO   
  176. --更新数据操作存储过程   
  177. create proc updateSync_process_ON187    
  178. as   
  179. begin tran --开始事物   
  180.    
  181. --将远程服务器更新的数据更新到本服务器中    
  182. update account    
  183. set status=_account.status,user_id=_account.user_id,car_id=_account.car_id,cardNo=_account.cardNo,cardType=_account.cardType,cost=_account.cost,lowestBalanceAfterConsume=_account.lowestBalanceAfterConsume,tollyLowestBalanceAC=_account.tollyLowestBalanceAC,noEntryBalance=_account.noEntryBalance,lowBalanceNotice=_account.lowBalanceNotice,openAccountTime=_account.openAccountTime,statusUpdateTime=_account.statusUpdateTime,remark=_account.remark,parkNo=_account.parkNo,balance=_account.balance    
  184. from syncDB187.Mydb_sync187.dbo.t_park_account _account,t_park_account account    
  185. where account.sys_id=_account.sys_id    
  186.    
  187. if @@ERROR<>0    
  188. begin   
  189. rollback tran   
  190. end   
  191.    
  192. update _user_    
  193. set sys_id=_user.sys_id,userName=_user.userName,credentialsType=_user.credentialsType,credentialsNo=_user.credentialsNo,phone=_user.phone,mobileNumber=_user.mobileNumber,address=_user.address   
  194. from syncDB187.Mydb_sync187.dbo.t_park_user _user,t_park_user _user_    
  195. where _user_.sys_id=_user.sys_id   
  196.    
  197. if @@ERROR<>0    
  198. begin   
  199. rollback tran   
  200. end   
  201.    
  202. update car    
  203. set  vehPlate=_car.vehPlate,carType=_car.carType,carColour=_car.carColour   
  204. from syncDB187.Mydb_sync187.dbo.t_park_car _car,t_park_car car    
  205. where car.sys_id=_car.sys_id    
  206.    
  207. if @@ERROR<>0    
  208. begin   
  209. rollback tran   
  210. end   
  211.    
  212. commit tran --提交事物   
  213.    
  214.    
  215. GO   
  216. --删除数据操作存储过程   
  217. create proc deleteSync_process_ON187    
  218. as    
  219. begin tran --开始事物   
  220.    
  221. --删除已删除的数据   
  222. delete account    
  223. from t_park_account account   
  224. where not exists(    
  225.                 select * from syncDB187.Mydb_sync187.dbo.t_park_account where sys_id=account.sys_id)    
  226.    
  227. if @@ERROR<>0    
  228. begin   
  229. rollback tran   
  230. end   
  231.    
  232. delete _user_    
  233. from t_park_user _user_   
  234. where not exists(    
  235.                 select * from syncDB187.Mydb_sync187.dbo.t_park_user where sys_id=_user_.sys_id)   
  236.    
  237. if @@ERROR<>0    
  238. begin   
  239. rollback tran   
  240. end   
  241.    
  242. delete car    
  243. from t_park_car car   
  244. where not exists(    
  245.                 select * from syncDB187.Mydb_sync187.dbo.t_park_car where sys_id=car.sys_id)   
  246.    
  247. if @@ERROR<>0    
  248. begin   
  249. rollback tran   
  250. end   
  251.    
  252. commit tran --提交事物 

你可能感兴趣的:(服务器,链接)