連結伺服器:在兩個 SQL Server 上同步兩個表
假設這些數據庫結構:
--On main server(server) TicketRequest (id, date, count, start, end/*,and some other columns*/) Ticket (id, reqId, blockedDate, usedDate, userId/*,and some other columns*/) --and some other tables --On linked server(gate) --Just this table Ticket (id, userId, blockedDate, usedDate)
A
Ticket
可以用在門上,所以在門上只是它usedDate
可能會改變。在伺服器端,
Ticket
可能會被屏蔽、刪除;或者在導入門的數據後,設置它的usedDate
.我想線上同步它們。
我寫了sp_server_export,sp_gate_import用於從伺服器傳輸數據和 sp_gate_export,sp_server_import用於從門傳輸數據,以通過文件同步它們(server_export文件進入門,server_import文件返回伺服器)。
我用過
MERGE
,它的性能真的很好!現在,當我試圖找到將伺服器與門同步的解決方案時,經過一些搜尋後不幸發現微軟說:MERGE
不在遠端表上工作!那麼,我如何與來自伺服器的交易同步?!
**注意:**按照我們的計劃,同步只能從伺服器執行!門操作員根本無法更改數據庫!
**重要提示:**考慮到並發是我最關心的問題!我想同步,而使用者可能會刪除
Ticket
!或者一個Ticket
可能同時阻塞!或者在門口一個Ticket
可以使用!更新 :
我們的同步邏輯是:
1 - 刪除舊票(它與文件同步返回,
returnDate
並且有modificationDate >
一個月後的時間戳,以確保從門中刪除用過的票)2 - 更新 gate.ticket 其中 usedDate 為空 set blockDate = server.blockDate;
3 - 從伺服器插入新行
4 - 為轉移到登機口的門票設置 transferDate(我的意思是步驟 2 和 3 中的新/更新門票)
5 - 從 gate.Ticket 更新 server.Ticket.usedDate,其中 gate.Ticket.usedDate 不為空。(這會將使用過的門票從登機口發送回伺服器)
6 - 插入一個傳輸日誌(在伺服器上的傳輸日誌表中)
如果你想用來
MERGE
同步遠端伺服器上的表,但你不能因為它在遠端伺服器上……From
MERGE
(Transact-SQL) :target_table不能是遠端表。
…您仍然應該能夠使用單獨的
UPDATE
andINSERT
語句來達到相同的效果。使用與 中相同的基本標準
MERGE
,您應該能夠:
UPDATE
所有已經存在的行;和INSERT
任何不存在的行。以該順序執行此操作可避免更新您剛剛插入的行。
MERGE
實際操作中INSERT
和UPDATE
步驟是分開做的,所以並發問題應該不會比 with 差MERGE
。