複製始終無法為訂閱者帶來新行
問題的簡短描述:
- 與訂閱者的初始同步工作正常。
- 後續同步無法下載新行。
- 重新初始化訂閱“修復”問題並且訂閱者獲得新行。
- 轉到第 2 步
更多細節:
我們在 SQL Server 2008 R2(發布者和訂閱者)上設置了一個新的合併複製。大多數表使用過濾器來篩選它們要複製的行,類似於以下範例:
SELECT <published_columns> FROM [dbo].[Table1] WHERE table1_id in (select table1_id from [dbo].[fn_GetTable1IDsForUser] (SUSER_SNAME()))
fn_GetTable1IDsForUser 函式根據預設標準為每個訂閱者帶來相關的 Table1 ID。在發布者上執行上述查詢(替換為 之後
<published_columns>
)*
正確返回預期的行。在訂閱(重新)初始化之後沒有立即完成的每個同步似乎都成功了,因為它不會產生錯誤消息,但是不會將新行下載到訂閱者。重新初始化訂閱允許下載新行,但僅限於第一次同步。
如果我嘗試驗證訂閱(在 Management Studio 中;它似乎只在我為所有訂閱執行此操作時才有效,嘗試為一個訂閱執行此操作無效),下一次同步會產生以下錯誤消息:
一篇或多篇文章的數據驗證失敗。進行故障排除時,請檢查輸出日誌文件中是否存在任何可能阻止數據正確同步的錯誤。請注意,當為文章禁用錯誤補償或刪除跟踪功能時,可能會發生不收斂。
我已遵循本文中的建議:http ://technet.microsoft.com/en-us/library/ms152532%28v=sql.105%29.aspx 但是建議的解決方案都沒有任何作用。
- 該表已過濾,並且沒有任何更改要傳遞給給定的訂閱者。
正如我上面所描述的,這基本上建議測試正常工作的過濾查詢。
- 一個或多個代理未執行或因錯誤而失敗。
沒有錯誤,除非我要求驗證訂閱。也沒有衝突。
- 事務訂閱在沒有快照的情況下進行了初始化,並且自發布創建以來發布伺服器上發生了更改。
- 事務發布的儲存過程執行的複制在訂閱伺服器上產生不同的結果。
- 事務性項目使用的 INSERT 儲存過程包括不滿足的條件。
這是合併複製,不是事務性的。
- 使用者、複製腳本或其他應用程序正在刪除數據。
同步後不會立即對數據產生任何影響。
- 數據正在被觸發器刪除,或者觸發器包含 ROLLBACK 語句。
除了複製本身設置的觸發器 (MSMerge_*) 之外,沒有觸發器。
最後,我們無法弄清楚為什麼會發生這種情況。我們歡迎任何建議。
我相信您遇到了您在合併文章中定義的子查詢未重新評估中描述的問題。
從文章來看,原因是:
出現此問題的原因是,當您更新子查詢引用的表中的行時,不會重新評估查詢,並且不會將行作為複制的一部分傳播。儘管您可以將子查詢放在行過濾器中,但它不是連接過濾器。儘管您可以定義基於另一個表中的數據的子查詢,但這也可能導致訂閱伺服器出現意外結果。
決議是:
若要解決此問題,當您希望在每個合併同步過程中重新評估過濾器定義時,請使用連接過濾器。