[轉]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 --提交事物 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章