合併式複寫的衝突解決

適用於:SQL Server

合併式複寫中的衝突,會根據為每個發行項指定的解決器來解決。 依預設,衝突的解決不需要使用者的介入。 但是可以在 Microsoft 複寫衝突檢視器中檢視衝突及變更解決的結果。

在複寫衝突檢視器中,可以在衝突保留期間所指定的時間內查看衝突資料(預設為 14 天)。 若要設定衝突保留期限,可以:

依預設,會儲存衝突資訊:

  • 在發行者與訂閱者端,若發行集相容性層級為 90RTM 或更高。
  • 在發行者端,如果發行集相容性等級低於 80RTM。
  • 若訂閱者執行 SQL Server Compact,則在發行者端。 衝突資料無法儲存在 SQL Server Compact 訂閱者上。

衝突資訊的儲存由 conflict_logging 發行集屬性控制。 如需詳細資訊,請參閱 sp_addmergepublication (Transact-SQL) 和 sp_changemergepublication (Transact-SQL)。

也可以使用 Microsoft 互動解析程式,在同步處理期間以互動的方式解決衝突。 互動解析程式會透過 Microsoft Windows Synchronization Manager 可供使用。 如需詳細資訊,請參閱使用 Windows 同步處理管理員同步處理訂閱 (Windows 同步處理管理員)。

解決衝突

  1. 在 Microsoft SQL Server Management Studio 中,連線到發行者(若適用則連線到訂閱者),然後展開伺服器節點。

  2. 展開 複寫 資料夾,然後展開 本機發佈 資料夾。

  3. 以滑鼠右鍵按一下您要檢視衝突的發行集,然後按一下 [檢視衝突] 。

    注意

    如果將 conflict_logging 屬性的值指定為 'subscriber' ,就無法使用 [檢視衝突] 功能表選項。 若要檢視衝突,請從命令提示字元啟動 ConflictViewer.exe。 依預設,ConflictViewer.exe 位於下列目錄:Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE。 如需有效的啟動參數清單,請執行 ConflictViewer.exe -?。

  4. 在 [選取衝突資料表] 對話方塊中,選取要檢視衝突的資料庫、發行集和資料表。

  5. 在複寫衝突檢視器中,您可以:

    • 使用上方表格右側的按鈕來篩選資料列。

    • 在上方表格中選取一列,即可在下方表格中顯示該列的資訊。

    • 在上方方格中選取一個或多個資料列,然後按一下 [移除],這相當於按一下 [提交成功者] 按鈕 (不會對資料進行任何變更)。

    • 按一下屬性按鈕 (...),即可查看涉及衝突的資料行的更多資訊。

    • 在提交資料之前,編輯 [衝突成功者] 或 [衝突失敗者] 資料行中的資料 (灰色資料行表示資料為唯讀)。

    • 按一下 提交勝出者 以接受指定為衝突勝出者的資料列。

    • 按一下 [提交失敗者] ,以覆寫解決並將指定為衝突失敗者的值傳播到拓撲中的所有節點。

    • 選取 [記錄此衝突的詳細資料] 即可將衝突資料記錄到檔案中。 若要指定檔案的位置,請指向 [檢視] 功能表,然後按一下 [選項] 。 輸入值,或按一下瀏覽按鈕 ( [...] ),然後導覽至適當的檔案。 按一下 [確定] 即可結束 [選項] 對話方塊。

  6. 關閉複寫衝突檢視器。

檢視衝突資訊

在合併式複寫中解決衝突時,遺失之資料列的資料會寫入衝突資料表。 可以使用複寫預存程序來以程式設計的方式檢視此衝突資料。 如需詳細資訊,請參閱 進階合併式複寫衝突偵測與解決。

  1. 在發行資料庫的發行者端,執行 sp_helpmergepublication。 請留意結果集中下列資料行的值:

    • centralized_conflicts - 1 表示在發行者上儲存衝突資料列,0 則表示不會在發行者上儲存衝突資料列。

    • decentralized_conflicts - 1 表示在訂閱者上儲存衝突資料列,0 則表示不會在訂閱者上儲存衝突資料列。

      注意

      合併式發行的衝突記錄行為是使用 sp_addmergepublication 的 @conflict_logging 參數來設定。 已淘汰使用 @centralized_conflicts 參數。

    下表描述這些資料行的值 (根據針對 @conflict_logging 所指定的值)。

    @conflict_logging 值 集中式_衝突 去中心化_衝突
    publisher 1 0
    訂閱者 0 1
    兩者 1 1
  2. 在發行資料庫的發行者端或訂閱資料庫的訂閱者端,執行 sp_helpmergearticleconflicts。 為 @publication 指定值,以僅傳回屬於特定發行集之文章的衝突資訊。 此操作會傳回發生衝突的發行項之衝突資料表資訊。 請記下任何感興趣的文章之 conflict_table 值。 如果某資料列的 conflict_table 值為 NULL,則此資料列中僅發生了刪除衝突。

  3. (選擇性) 檢閱感興趣之發行項的衝突資料列。 根據步驟 1 中 centralized_conflicts 和 decentralized_conflicts 的值而定,執行下列其中一項:

    • 在發行集資料庫中的發行者端,執行 sp_helpmergeconflictrows。 為 @conflict_table 指定步驟 1 中文章的衝突資料表。 (選擇性) 指定 @publication 的值,將傳回的衝突資訊限制為特定發行集。 這樣會傳回遺失之資料列的資料列資料和其他資訊。

    • 在訂閱資料庫的訂閱者端,執行 sp_helpmergeconflictrows。 為 @conflict_table 指定步驟 1 中項目的衝突資料表。 這樣會傳回遺失之資料列的資料列資料和其他資訊。

發生刪除失敗的衝突

  1. 在發行資料庫的發行者端,執行 sp_helpmergepublication。 請留意結果集中下列資料行的值:

    • centralized_conflicts - 1 表示在發行者上儲存衝突資料列,0 則表示不會在發行者上儲存衝突資料列。

    • decentralized_conflicts - 1 表示在訂閱者上儲存衝突資料列,0 則表示不會在訂閱者上儲存衝突資料列。

      注意

      合併發行集的衝突記錄行為是使用 sp_addmergepublication 的 @conflict_logging 參數設定。 已淘汰使用 @centralized_conflicts 參數。

  2. 在發行集資料庫的發行者上或是在訂閱資料庫的訂閱者上,執行 sp_helpmergearticleconflicts。 針對 @publication 指定值,只傳回屬於特定發行集的發行項衝突資料表資訊。 這樣會傳回有衝突之發行項的衝突資料表資訊。 請記下任何感興趣文章的 source_object 值。 如果文章的 conflict_table 值為 NULL,表示此文章中只發生了刪除衝突。

  3. (選擇性) 檢查刪除衝突的相關資訊。 根據步驟 1 中 centralized_conflicts 和 decentralized_conflicts 的值而定,執行下列其中一項:

    • 在發行資料庫的發行者端,執行 sp_helpmergedeleteconflictrows。 針對 @source_object 指定衝突發生所在的來源資料表名稱 (來自步驟 1)。 (選擇性) 指定 @publication 的值,將傳回的衝突資訊限制為特定發行集。 此操作會傳回儲存在發行者端的刪除衝突資訊。

    • 在訂閱資料庫的訂閱者端,執行 sp_helpmergedeleteconflictrows。 針對 @source_object 指定衝突發生所在的來源資料表名稱 (來自步驟 1)。 (選擇性) 指定 @publication 的值,將傳回的衝突資訊限制為特定發行集。 此作業會傳回儲存在訂閱者端的刪除衝突資訊。