2013-01-05 101 views
0

問題與服務器

同步時,在客戶端數據庫中的主鍵clashs處理如何避免在客戶機/服務器的數據庫主鍵衝突

背景

我同步一個相互數據庫的數量。我有一箇中央SQL Server數據庫和許多客戶端SQL Server數據庫。現在說我有數據庫中的表X有主鍵ID。

在第一客戶端,我們在表X以下ID:

X(客戶1)
--------
1 | someValue中
2 | someValue中
3 | someValue中
4 | someValue中

以及在第二客戶端I有

X(客戶端2)
--------
1 | someValue中
2 | someValue中
3 | someValue中
4 | someValue中

當我同步,我希望客戶機只能上傳他們的數據,而不是下載它們。

現在,當我與服務器同步的第一客戶端,它將從(1。4)添加的主鍵。但是,當我與第二個客戶端同步時,會出現PRIMARY KEY CLASH。我怎麼解決這個問題?

我使用SQL Server 2008 R2中,同步框架和C#。

我已經考慮過使用GUID作爲主鍵這是不可行的在我的情況,因爲我處理遺留數據庫的想法。此外,重新設置有點容易出錯的IDENTITY值的想法。如何在不插入值的情況下增加標識列? P.S:主鍵設置爲IDENTITY,增量爲1.

+0

您依賴客戶端生成的主鍵的目的是什麼? –

+0

我正在同時收集來自不同城市的信息。之後,數據上傳到駐留在大寫服務器中的表格中。該數據庫用於調查應用程序,這意味着我有不同的調查設備「平板電腦」,並且它們都有本地數據庫。收集信息後,是時候將它們提交給服務器。因此,可能是一個本地數據庫中的主鍵與另一個數據庫中的主鍵具有相同的值。我希望這更清楚。 –

+0

您能夠對遺留數據庫進行任何修改嗎? –

回答

5

爲了支持能夠插入記錄的分佈式客戶端,模式必須支持客戶端數據庫創建沒有衝突的行。這意味着要麼使用PK的GUID,要麼使用連接的鍵。 (ID + ClientID)*方式,模式更改。

手動同步客戶端數據庫否則意味着在插入或處理異常之前檢查衝突ID,然後替換ID或允許爲衝突記錄生成身份。這意味着更新所有FK關係。耗時且容易出錯。

+0

我的想法是串聯的想法,因爲它似乎是最可行的解決方案。希望我們從我們的錯誤中學習未來的項目。謝謝。 –

2

有這個工作的一些方法。首先是如果有一個有保證的唯一鍵,上游和下游數據庫都可以引用該記錄。在SQL服務器的情況下,你需要的密鑰類型是唯一標識符(GUID又名)。現在

,如果由於某種原因,你不能使用UNIQUEIDENTIFIER,第二個最好的選擇是對的位置或類似的東西添加一個附加列。此列將標識記錄來自的個人數據庫。例如,第一個客戶端可能具有1的位置ID,第二個2等。然後,您將修改現有的主鍵爲該位置ID和您當前的ID的複合鍵。

第三種方法是根本不修改客戶端數據庫,但只將位置ID列添加到「主」數據庫中的表中。如果您手動在代碼中進行同步,則代碼需要考慮記錄來自哪裏並根據需要添加ID。這可能是困難的,但肯定是可能的。

因爲你必須重新選擇客戶端數據庫以在特定點啓動其身份值,例如,客戶端1的值可能爲1至10000,客戶端2的值可能爲10001至20000.但是,您可以在此查看失敗的可能性。不僅僅是客戶端超出了你允許的範圍,而且如果你設置了額外的客戶端,並且有人把種子值搞砸了。此外,這將是一個總PITA來修復所有現有的客戶端。


作爲一個方面說明,建設你知道將會有一個需要合併它幾乎是普遍明智的做法是簡單地使用的GUID作爲主鍵的分佈式數據庫的應用程序時。是的,它會碎片索引等,但在這種情況下,這些缺點比完整的PITA更可取,並且最終將所有數據合併在一起時可能會出現錯誤。

+0

正如我所見,將ID和客戶端ID結合起來將是最好的選擇。我建議使用GUID給我的主管,但是他告訴我時,它已經不在桌面上了。畢竟,我只是從最後才加入這個項目。 Thx非常。 –