Sql-Server

連結伺服器:在兩個 SQL Server 上同步兩個表

  • July 26, 2017

假設這些數據庫結構:

--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)

ATicket可以用在門上,所以在門上只是它usedDate可能會改變。

在伺服器端,Ticket可能會被屏蔽、刪除;或者在導入門的數據後,設置它的usedDate.

我想線上同步它們。

我寫了sp_server_exportsp_gate_import用於從伺服器傳輸數據和 sp_gate_exportsp_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不能是遠端表。

…您仍然應該能夠使用單獨的UPDATEandINSERT語句來達到相同的效果。

使用與 中相同的基本標準MERGE,您應該能夠:

  1. UPDATE所有已經存在的行;和
  2. INSERT任何不存在的行。

以該順序執行此操作可避免更新您剛剛插入的行。MERGE實際操作中INSERTUPDATE步驟是分開做的,所以並發問題應該不會比 with 差MERGE

社區維基答案

引用自:https://dba.stackexchange.com/questions/181731