- -- 刪除鏈接和鏈接服務器
- Exec sp_droplinkedsrvlogin syncDB,Null
- Exec sp_dropserver syncDB
- EXEC sp_addlinkedserver
- @server='syncDB',--被訪問的服務器別名
- @srvproduct='',
- @provider='SQLOLEDB',
- @datasrc='202.**.***.43\MSSQLSERVER2008' --要訪問的服務器實例名
- ---- @datasrc='servername\instancename'
- ---- servername 是運行 SQL Server 的計算機名稱(或者IP),instancename 是用戶將被連接到的特定 SQL Server 實例的名稱
- EXEC sp_addlinkedsrvlogin
- 'syncDB', --被訪問的服務器別名
- 'false',
- NULL,
- 'sa', --帳號
- 'sa' --密碼
- exec sp_serveroption 'syncDB43','rpc out','true'; --允許調用鏈接服務器上的存儲過程
- -- 在遠程服務器43的作業中調用本服務器的存儲過程saveSync_process_ON187
- --exec('exec Mydb_sync187.dbo.saveSync_process_ON187') at syncDB43;
- **/
- /*--鏈接服務器同步數據示例
- 服務器HAI:
- hostname:HAI
- 實例名:HAI\BRUCESERVER
- (測試)數據庫名:Mydb_sync187
- 服務器CHOW:
- hostname:CHOW
- 實例名:CHOW\SQL2008
- (測試)數據庫名:Mydb_sync10
- 同步要求:
- 、在服務器HAI在的My_sync187數據庫出現save、update、delete操作後,將數據同步到服務器CHOW的Mydb_sync10數據庫中,保持數據一致性。
- 、在服務器CHOW在的Mydb_sync10數據庫出現save、update、delete操作後,將數據同步到服務器HAI的Mydb_sync187數據庫中,保持數據一致性。
- --*/
- /*
- -- 在服務器HAI上完成save、update、delete操作後將數據單向同步到服務器CHOW上的設置如下列步驟所示(在服務器CHOW的設置相似)
- */
- --步驟1:在服務器HAI上創建鏈接服務器(鏈接到服務器CHOW,202.**.***.10):
- -------
- Exec sp_droplinkedsrvlogin syncDB10,Null
- Exec sp_dropserver syncDB10
- EXEC sp_addlinkedserver
- @server='syncDB10',--被訪問的服務器別名
- @srvproduct='',
- @provider='SQLOLEDB',
- @datasrc='202.**.***.10\SQL2008' --要訪問的服務器
- EXEC sp_addlinkedsrvlogin
- 'syncDB10', --被訪問的服務器別名
- 'false',
- NULL,
- 'sa', --帳號
- 'sa' --密碼
- --步驟2:在服務器HAI上啓動 msdtc(分佈式事務處理服務),並且設置爲自動啓動
- -- 我的電腦--控制面板--管理工具--服務--右鍵 Distributed Transaction Coordinator--屬性--啓動--並將啓動類型設置爲自動啓動
- -- 注:如果在第1步Distributed Transaction Coordinator 無法啓動,則是因爲丟失了日誌文件,重新創建日誌文件,再啓動就行了。重新創建 MSDTC 日誌,並重新啓動服務的步驟如下:
- -- (1) 單擊"開始",單擊"運行",輸入 cmd 後按"確定"。
- -- (2) 輸入:msdtc -resetlog (注意運行此命令時,不要執行掛起的事務)
- -- (3) 最後輸入:net start msdtc 回車。
- --步驟3: 在服務器HAI上的數據庫Mydb_sync187 創建一個作業定時遠程調用服務器CHOW數據庫Mydb_sync10上的同步處理存儲過程。
- -- 企業管理器
- -- 管理
- -- SQL Server代理
- -- 右鍵作業
- -- 新建作業
- -- "常規"項中輸入作業名稱,如 Mydb_sync187_job
- -- "步驟"項
- -- 新建
- -- "步驟名"中輸入步驟名,如 Mydb_sync187_step
- -- "類型"中選擇"Transact-SQL 腳本(TSQL)"
- -- "數據庫"選擇執行命令的數據庫,如 Mydb_sync187
- -- "命令"中輸入要執行的語句:
- EXEC sp_addlinkedserver
- @server='syncDB10',--被訪問的服務器別名
- @srvproduct='',
- @provider='SQLOLEDB',
- @datasrc='202.**.***.10\SQL2008'; --要訪問的服務器
- EXEC sp_addlinkedsrvlogin
- 'syncDB10', --被訪問的服務器別名
- 'false',
- NULL,
- 'sa', --帳號
- 'sa'; --密碼
- --允許調用鏈接服務器syncDB10上的存儲過程
- EXEC sp_serveroption 'syncDB10','rpc out','true';
- EXEC('exec Mydb_sync10.dbo.saveSync_process_ON10') at syncDB10;
- EXEC('exec Mydb_sync10.dbo.updateSync_process_ON10') at syncDB10;
- EXEC('exec Mydb_sync10.dbo.deleteSync_process_ON10') at syncDB10;
- Exec sp_droplinkedsrvlogin syncDB10,Null;
- Exec sp_dropserver syncDB10;
- -- 確定
- -- "調度"項
- -- 新建調度
- -- "名稱"中輸入調度名稱
- -- "調度類型"中選擇你的作業執行安排
- -- 如果選擇"反覆出現"
- -- 點"更改"來設置你的時間安排 (設置合理的時間安排)
- -- 然後將SQL Agent服務啓動,並設置爲自動啓動,否則你的作業不會被執行
- -- 設置方法:
- -- 我的電腦--控制面板--管理工具--服務--右鍵 SQLSERVERAGENT--屬性--啓動類型--選擇"自動啓動"--確定.
- --步驟4:在服務器HAI上調用服務器CHOW上的實現同步處理的存儲過程如下
- -- 服務器CHOW上Mydb_sync10數據庫中創建如下的同步處理存儲過程:
- GO
- --新增數據操作存儲過程
- create proc saveSync_process_ON187
- as
- begin tran --開始事物
- --將遠程服務器新增的數據同步到本服務器中
- insert t_park_account(status,user_id,car_id,cardNo,cardType,cost,lowestBalanceAfterConsume,tollyLowestBalanceAC,noEntryBalance,lowBalanceNotice,openAccountTime,statusUpdateTime,remark,parkNo,balance)
- select status,user_id,car_id,cardNo,cardType,cost,lowestBalanceAfterConsume,tollyLowestBalanceAC,noEntryBalance,lowBalanceNotice,openAccountTime,statusUpdateTime,remark,parkNo,balance
- from syncDB187.Mydb_sync187.dbo.t_park_account _account
- where not exists(
- select * from t_park_account where sys_id=_account.sys_id)
- --@@error的值不等於0表示上一條SQL語句執行結果有錯,即採取事物回滾措施
- if @@ERROR<>0
- begin
- rollback tran
- end
- insert t_park_user(sys_id,userName,credentialsType,credentialsNo,phone,mobileNumber,address)
- select sys_id,userName,credentialsType,credentialsNo,phone,mobileNumber,address
- from syncDB187.Mydb_sync187.dbo.t_park_user _user
- where not exists(
- select * from t_park_user where sys_id=_user.sys_id)
- if @@ERROR<>0
- begin
- rollback tran
- end
- insert t_park_car(vehPlate,carType,carColour)
- select vehPlate,carType,carColour
- from syncDB187.Mydb_sync187.dbo.t_park_car _car
- where not exists(
- select * from t_park_car where sys_id=_car.sys_id)
- if @@ERROR<>0
- begin
- rollback tran
- end
- commit tran --提交事物
- GO
- --更新數據操作存儲過程
- create proc updateSync_process_ON187
- as
- begin tran --開始事物
- --將遠程服務器更新的數據更新到本服務器中
- update account
- 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
- from syncDB187.Mydb_sync187.dbo.t_park_account _account,t_park_account account
- where account.sys_id=_account.sys_id
- if @@ERROR<>0
- begin
- rollback tran
- end
- update _user_
- set sys_id=_user.sys_id,userName=_user.userName,credentialsType=_user.credentialsType,credentialsNo=_user.credentialsNo,phone=_user.phone,mobileNumber=_user.mobileNumber,address=_user.address
- from syncDB187.Mydb_sync187.dbo.t_park_user _user,t_park_user _user_
- where _user_.sys_id=_user.sys_id
- if @@ERROR<>0
- begin
- rollback tran
- end
- update car
- set vehPlate=_car.vehPlate,carType=_car.carType,carColour=_car.carColour
- from syncDB187.Mydb_sync187.dbo.t_park_car _car,t_park_car car
- where car.sys_id=_car.sys_id
- if @@ERROR<>0
- begin
- rollback tran
- end
- commit tran --提交事物
- GO
- --刪除數據操作存儲過程
- create proc deleteSync_process_ON187
- as
- begin tran --開始事物
- --刪除已刪除的數據
- delete account
- from t_park_account account
- where not exists(
- select * from syncDB187.Mydb_sync187.dbo.t_park_account where sys_id=account.sys_id)
- if @@ERROR<>0
- begin
- rollback tran
- end
- delete _user_
- from t_park_user _user_
- where not exists(
- select * from syncDB187.Mydb_sync187.dbo.t_park_user where sys_id=_user_.sys_id)
- if @@ERROR<>0
- begin
- rollback tran
- end
- delete car
- from t_park_car car
- where not exists(
- select * from syncDB187.Mydb_sync187.dbo.t_park_car where sys_id=car.sys_id)
- if @@ERROR<>0
- begin
- rollback tran
- end
- commit tran --提交事物