2015-11-06 113 views
0

我有關於合併複製的問題。我有一個表設置我在哪裏存儲我的軟件的設置。 表格的架構是ID(PK),Description,Value。 假設我的服務器上有15行這個表。 現在我已經在這個表上應用了過濾器,表示只有前10行將被複制。SQL合併複製問題

現在有了這個設置時,我同步的第一次,我收到我的客戶(具有訂閱)上的10行。 然後我在客戶端添加剩餘的5個。 現在,當我再次同步它給了我一個衝突說在「ClientServer.ClientDatabaseName」是

一個行插入不能 傳播到「MyServer.ServerDatabaseName」。這種故障可能是由違反約束條件造成的 。違反PRIMARY KEY約束條件 'PK_SETTINGS'。無法在對象'dbo.SETTINGS'中插入重複鍵。 重複的鍵值是(11)。

我不明白的是爲什麼它試圖複製某些應用在該表上的子集過濾器之外的東西(行)?請幫助傢伙。

這種情況不適用於合併複製嗎?

https://msdn.microsoft.com/en-us/library/ms151775.aspx的聯繫表明這是可能的。但困惑。

+0

請在合併文章上分享過濾器定義。 – Greg

+0

這是條件「SETTINGS.ID <10」 – Saurabh

+0

是一個標識列?用戶上插入了什麼值?如果您設置了身份範圍,則需要進行不同的過濾。 – Greg

回答

1

爲合併項目創建的過濾器僅在發佈者處進行評估。用戶所做的更改將始終傳播回用戶,即使他們超出了篩選條件。但是,如果來自一個訂閱者的更改不符合過濾標準,則他們將坐在發佈者身上,但不會被複制到所有其他訂閱者。

這是一個生產方案,或者是你玩弄複製?如果您進行靜態過濾,這就是您上面的過濾,它通常在只讀類型的表上完成。例如,現場的銷售人員可能只需要他們地區的產品價格。他們不希望更新此表。如果您進行動態過濾,例如,基於HOSTNAME()進行過濾,那麼您只會獲取該用戶的特定數據。例如,現場的銷售人員只會收到他們的客戶信息。因此,除非在多個銷售人員之間共享,否則對該信息的任何更新都會傳播回去,而不會傳播給其他任何人。

在你的情況,我不建議在具有靜態過濾器的用戶更新表,因此,我建議重新評估你的過濾設計,確保你有你的情況下正確的過濾模型。

+0

那麼你在我的場景中建議什麼?我可以通過使用動態過濾器來實現嗎?如果是的話如何? – Saurabh

+0

有沒有辦法阻止用戶向發佈者發送某些行?我從你的回覆中瞭解到,訂閱者所做的任何更改都將始終傳播給發佈者,即使它超出了過濾條件。 – Saurabh

+0

您可以防止用戶被複制回來的所有更改,但不能選擇性地進行復制。聽起來你需要設計審查,這是不能在論壇上完成的,最好在當地諮詢專家。 – Greg