2011-05-11 108 views
2

您能否請我建議我可以自動解決 在發佈服務器和訂閱服務器合併期間的主鍵衝突。看來SQL Server不這樣做開箱:(的自動解決主鍵合併衝突

衝突查看器顯示我下一條消息:。

在「_publisher_server_」 A行插入無法傳播到「_subscriber_server_」這故障可以通過約束衝突引起的。PRIMARY KEY約束違反 'PK_ PartPlan _FD9D7F927172C0B5'。不能在對象中插入重複鍵 '_table_name_'。

謝謝。

回答

1

這不是一個簡單的解決方案(因爲你大概已經設計了數據庫,並且自動遞增鍵int),但是爲主鍵使用GUID(「uniqueidentifier」)將解決PK衝突問題。

+0

或者,更好的是,選擇一個主鍵的定義是獨一無二的。 – 2011-05-11 12:24:12

+0

不能這樣做,因爲歷史原因:( – spkenny 2011-05-11 12:27:20

+0

@弗拉季斯拉夫:「自然」的主鍵是很好的,當他們存在時,但以我的經驗,他們是非常罕見的(通常情況下,似乎理想的自然鍵最終有重複無論如何,像社會安全號碼,例如) – MusiGenesis 2011-05-11 13:31:07

0

您是否嘗試過WHEN MATCHED THENWHEN NOT MATCHED BY TARGET THEN來執行UPSERT(條件UPDATE或INSERT)?

可以找到文檔here

我假設主鍵代表兩個數據庫中的相同項目。

+0

嗯,我沒有很好的exp。與複製。當PK衝突出現時,我能以某種方式運行上面的代碼嗎? 如果我可以編寫某種可以處理這種衝突類型的自動解析器,那將會很棒(T-SQL或C#)。 我知道自定義解析器,但他們可以處理這種衝突嗎?也許有人曾經這樣做過? – spkenny 2011-05-11 12:47:10

+0

也許http://msdn.microsoft.com/en-us/library/ms147911.aspx?然後你可以實現'InsertErrorHandler'。 – 2011-05-11 13:13:16

0

使用自動調整器PK解決此問題的最簡單方法是將自動編號增量從1更改爲10(或100或1000,無論需要什麼),然後在所有參與者上設置不同的種子。

所以,我可以開始種子:
DB1在1
DB2在3
在2
DB3 ...
DBN在N(N <增量)

例如: 100的增量將產生PK的於DB:
DB1:** 101,201,301 ...
DB2:** 102,202,302 ...
DB3:** 103,203,303 .. 。
無論有多少行INSERT ed,它們總是會有唯一的PK,因爲最後的數字反映了特定的數據庫。

這種方法可以根據您的用戶數量進行調整,它們永遠不會發生碰撞,並且只要您使用代理鍵,您就可以獲得知道原點的額外好處。

對於現有的表,只需通過腳本重置PK種子和間隔。這應該很容易做到。


可以使用手冊PK,但使用GUID可以作爲主鍵比較困難的,特別是如果你不也是從聚集索引中刪除。 它們也更大,你可能已經有代碼取決於整數。

當您創建合併複製,SQL Server會自動創建,使用它來跟蹤更改的GUID,但是,這並不意味着他們需要的是PK的