驗證複寫的資料

適用於:SQL ServerAzure SQL Database

本主題說明如何使用 SQL Server Management Studio、Transact-SQL 或 Replication Management Objects (RMO),在 SQL Server 驗證訂閱者端的資料。

交易式與合併式複寫可以讓您驗證訂閱者端的資料是否與發行者端的資料相符。 可以驗證特定的訂閱或發行的所有訂閱。 指定下列其中一種驗證類型,「散發代理程式」或「合併代理程式」將在下次執行時驗證資料:

  • 僅限資料列計數。 這將會驗證「訂閱者」上的資料表與「發行者」上的資料表是否具有相同數量的資料列,但無法驗證資料列內容是否相符。 資料列計數驗證提供一種輕量型驗證方法,可讓您發現資料中的問題。
  • 資料列計數與二進位總和檢查碼。 除了統計「發行者」與「訂閱者」上的資料列數量之外,也會使用總和檢查碼演算法計算所有資料的總和檢查碼。 如果資料列計數失敗,就不會執行總和檢查碼。

除驗證「訂閱者」與「發行者」上的資料是否相符外,合併代理程式還可以驗證是否為每個「訂閱者」正確分割資料。 如需詳細資訊,請參閱驗證合併訂閱者的資料分割資訊

注意

Azure SQL 受控執行個體可以是快照式與異動複寫的發行者、散發者與訂閱者。 Azure SQL Database 中的資料庫只能是快照式與異動複寫的發送訂閱者。 如需詳細資訊,請參閱使用 Azure SQL DatabaseAzure SQL 受控執行個體的異動複寫。

資料驗證如何運作

SQL Server 藉由計算「發行者」的資料列計數或總和檢查碼,然後將那些值與「訂閱者」所計算的資料列計數或總和檢查碼相比較,以驗證其資料。 整個發行集資料表計算一個值,整個訂閱資料表也計算一個值,但是 textntextimage 資料行的資料不包含在其計算中。

在執行計算時,會暫時以共用鎖定來鎖定正在執行資料列計數或總和檢查碼的資料表,但此計算會迅速完成,並移除共用鎖定,通常只需要數秒鐘。

使用二進位總和檢查碼時,資料行會逐一發生 32 位元的 Redundancy Check (CRC),而不是資料頁中實際資料列的 CRC。 如此可讓具有該資料表的資料行在資料頁以任何次序排序,而仍可計算資料列的相同 CRC。 發行集具有資料列或資料行篩選時,可以使用二進位總和檢查碼驗證。

驗證資料是一個三部份式的處理:

  1. 「標示」 要驗證之發行集的單個或所有訂閱。 在 [驗證單一訂閱]、[驗證多個訂閱] 和 [驗證所有訂閱] 對話方塊 (位於 Microsoft SQL Server Management Studio 的 [本機發行集] 資料夾和 [本機訂閱] 資料夾) 中標示要驗證的訂閱。 您也可以從複寫監視器中的 [所有訂閱] 索引標籤、 [訂閱監看清單] 索引標籤和發行集節點標示訂閱。 如需啟動複寫監視器的詳細資訊,請參閱啟動複寫監視器

  2. 在下一次由「散發代理程式」(用於異動複寫) 或「合併代理程式」(用於合併式複寫) 進行同步時,將對訂閱進行驗證。 「散發代理程式」通常連續執行,此時可立即進行驗證;「合併代理程式」通常視需要執行,此時驗證將在執行代理程式後進行。

  3. 檢視驗證結果:

    • 在「複寫監視器」的詳細資料視窗中:用於異動複寫的 [散發者到訂閱者記錄] 索引標籤和用於合併式複寫的 [同步處理記錄] 索引標籤上。
    • 在 Management Studio 中的 [檢視同步狀態]對話方塊。

考量與限制

在驗證資料時,請考慮下列問題:

  • 您必須在驗證資料之前停止「訂閱者」上的所有更新活動 (在進行驗證時不必停止「發行者」上的活動)。
  • 由於總和檢查碼與二進位總和檢查碼在驗證大型資料集時,可能需要使用大量的處理器資源,因此應該將驗證排在伺服器複寫活動最少的時間來進行。
  • 複寫僅驗證資料表;它無法驗證只有結構描述的發行項 (例如預存程序) 在「發行者」與「訂閱者」上是否相同。
  • 二進位總和檢查碼可以與任何已發行資料表一起使用。 總和檢查碼無法驗證具有資料行篩選或其中資料行位移不同 (由於 ALTER TABLE 陳述式卸除或新增資料行) 的邏輯資料表結構的資料表。
  • 複寫驗證會使用 checksumbinary_checksum 函數。 如需其行為的資訊,請參閱總和檢查碼 (Transact-SQL)BINARY_CHECKSUM (Transact-SQL)
  • 如果「訂閱者」與「發行者」端的資料類型不同,則使用二進位總和檢查碼或總和檢查碼的驗證可能會誤報失敗。 如果執行下列任何一項操作,就可能發生上述情況:
    • 將結構描述選項明確地設定為對應舊版 SQL Server 的資料類型。
    • 將合併式發行集的發行集相容性層級設定為舊版 SQL Server,而已發行的資料表則包含一或多個必須對應此版本的資料類型。
    • 手動初始化訂閱且在「訂閱者」端使用不同的資料類型。
  • 異動複寫的可轉換訂閱不支援二進位總和檢查碼與總和檢查碼驗證。
  • 複寫給非 SQL Server 訂閱者的資料不支援驗證。
  • 「複寫監視器」的程序僅用於發送訂閱,因為發送訂閱無法在「複寫監視器」中同步。 但是,您可以標示要驗證的訂閱,並在「複寫監視器」中檢視發送訂閱的驗證結果。
  • 驗證結果會指示驗證成功或失敗,但不會在驗證失敗時指定失敗的資料列。 若要比較「發行者」和「訂閱者」端的資料,請使用 tablediff Utility。 如需使用這個公用程式與複本資料的詳細資訊,請參閱比較複寫資料表的差異 (複寫程式設計)

資料驗證結果

當驗證完成時,「散發代理程式」或「合併代理程式」將記錄有關成功或失敗的訊息 (複寫不會報告具體是哪些資料列失敗)。 可以在 SQL Server Management Studio、複寫監視器和複寫系統資料表中檢視這些訊息。 以上列出的「如何」主題示範如何執行驗證並檢視結果。

若要處理驗證失敗,請考慮下列各項:

異動複寫中的發行項

使用 SQL Server Management Studio

  1. 連線到 Microsoft SQL Server Management Studio 的發行者,然後展開伺服器節點。
  2. 展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
  3. 以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證訂閱]
  4. 在 [驗證訂用帳戶] 對話方塊中,選取要驗證的訂用帳戶:
    • 選取 [驗證所有的 SQL Server 訂閱]
    • 選取 [驗證下列訂閱],然後選取一或多個訂閱。
  5. 若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [驗證選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。
  6. 選取 [確定]。
  7. 在複寫監視器或 [檢視同步處理的狀態] 對話方塊中檢視驗證結果。 針對每個訂用帳戶:
    1. 展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]
    2. 如果代理程式尚未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動] 。 對話方塊就會顯示關於驗證的參考用訊息。
      如果您未看到任何關於驗證的訊息,則代理程式已經記錄了後續訊息。 在此情況下,請在複寫監視器中檢視驗證結果。 如需詳細資訊,請參閱這個主題中<複寫監視器>的如何程序。

使用 TRANSACT-SQL

所有發行項

  1. 在發行集資料庫的發行者端,執行 sp_publication_validation (Transact-SQL)。 針對 @rowcount_only 指定 @publication 和下列其中一個值:

    • 1 - 只限列數檢查 (預設值)
    • 2 - 列數及二進位總和檢查碼。

    注意

    當您執行 sp_publication_validation (Transact-SQL) 時,會針對每個發行集中的發行項執行 sp_article_validation (Transact-SQL)。 若要成功執行 sp_article_validation (Transact-SQL),您必須有已發行基底資料表之所有資料行的 SELECT 權限。

  2. (選擇性) 針對每個訂閱啟動「散發代理程式」(如果尚未執行)。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription

  3. 檢查代理程式輸出,以取得驗證的結果。

單一發行項

  1. 在發行集資料庫的發行者端,執行 sp_article_validation (Transact-SQL)。 指定 @publication,針對 @article 指定發行項名稱及針對 @rowcount_only 指定下列其中一個值:

    • 1 - 只限列數檢查 (預設值)
    • 2 - 列數及二進位總和檢查碼。

    注意

    若要成功執行 sp_article_validation (Transact-SQL),您必須有已發行基底資料表之所有資料行的 SELECT 權限。

  2. (選擇性) 針對每個訂閱啟動「散發代理程式」(如果尚未執行)。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription

  3. 檢查代理程式輸出,以取得驗證的結果。

單一訂閱者

  1. 在發行集資料庫的發行者端,使用 BEGIN TRANSACTION (Transact-SQL) 來開啟明確交易。

  2. 在發行集資料庫的發行者端,執行 sp_marksubscriptionvalidation (Transact-SQL)。 指定 @publication 的發行集、@subscriber 的訂閱者名稱及 @destination_db 的訂閱資料庫名稱。

  3. (選擇性) 針對每個要驗證的訂閱重複步驟 2。

  4. 在發行集資料庫的發行者端,執行 sp_article_validation (Transact-SQL)。 指定 @publication,針對 @article 指定發行項名稱及針對 @rowcount_only 指定下列其中一個值:

    • 1 - 只限列數檢查 (預設值)
    • 2 - 列數及二進位總和檢查碼。

    注意

    若要成功執行 sp_article_validation (Transact-SQL),您必須有已發行基底資料表之所有資料行的 SELECT 權限。

  5. 在發行集資料庫的發行者端,使用 COMMIT TRANSACTION (Transact-SQL) 來認可交易。

  6. (選擇性) 針對每個要驗證的發行項重複步驟 1 到 5。

  7. (選擇性) 啟動「散發代理程式」(如果尚未執行)。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription

  8. 檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱 Validate Data at the Subscriber

交易式發行集的所有發送訂閱

使用複寫監視器

  1. 在複寫監視器的左窗格中展開發行者群組,然後展開發行者。

  2. 以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證訂閱]

  3. [驗證訂閱] 對話方塊中,選取要驗證的訂閱:

    • 選取 [驗證所有的 SQL Server 訂閱]
    • 選取 [驗證下列訂閱],然後選取一或多個訂閱。
  4. 若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [驗證選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。

  5. 選取 [確定]。

  6. 按一下 [所有訂閱] 索引標籤。

  7. 檢視驗證結果。 針對每個發送訂閱:

    1. 如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]
    2. 以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]
    3. 檢視 [所選取工作階段中的動作] 文字區域之 [散發者到訂閱者記錄] 索引標籤中的資訊。

針對合併式發行集的單一訂閱

使用 SQL Server Management Studio

  1. 連線到 Microsoft SQL Server Management Studio 的發行者,然後展開伺服器節點。

  2. 展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。

  3. 展開要驗證訂閱的發行集,以滑鼠右鍵按一下訂閱,然後按一下 [驗證單一訂閱]

  4. [驗證訂閱] 對話方塊中,選取 [驗證此訂閱]

  5. 若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。

  6. 選取 [確定]。

  7. 在「複寫監視器」或 [檢視同步處理的狀態] 對話方塊中檢視驗證結果:

    1. 展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]
    2. 如果代理程式未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動] 。 對話方塊就會顯示關於驗證的參考用訊息。

    如果您未看到任何關於驗證的訊息,則代理程式已經記錄了後續訊息。 在此情況下,請在複寫監視器中檢視驗證結果。 如需詳細資訊,請參閱這個主題中<複寫監視器>的如何程序。

針對合併式發行集的所有訂閱

使用 SQL Server Management Studio

  1. 連線到 Microsoft SQL Server Management Studio 的發行者,然後展開伺服器節點。

  2. 展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。

  3. 以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證所有訂閱]

  4. [驗證所有訂閱] 對話方塊中,指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼)。

  5. 選取 [確定]。

  6. 在複寫監視器或 [檢視同步處理的狀態] 對話方塊中檢視驗證結果。 針對每個訂閱:

    1. 展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]
    2. 如果代理程式未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動] 。 對話方塊就會顯示關於驗證的參考用訊息。

    如果您未看到任何關於驗證的訊息,則代理程式已經記錄了後續訊息。 在此情況下,請在複寫監視器中檢視驗證結果。 如需詳細資訊,請參閱這個主題中<複寫監視器>的如何程序。

針對合併式發行集的單一發送訂閱

使用複寫監視器

  1. 在複寫監視器中,展開左窗格裡的發行者群組,展開發行者,然後按一下發行集。
  2. 按一下 [所有訂閱] 索引標籤。
  3. 以滑鼠右鍵按一下您要驗證的訂閱,然後按一下 [驗證單一訂閱]
  4. [驗證訂閱] 對話方塊中,選取 [驗證此訂閱]
  5. 若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。
  6. 選取 [確定]。
  7. 按一下 [所有訂閱] 索引標籤。
  8. 檢視驗證結果:
    1. 如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]
    2. 以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]
    3. [同步處理記錄] 索引標籤上的 [所選取工作階段的最後訊息] 測試區域中檢視資訊。

使用 TRANSACT-SQL

  1. 在發行集資料庫的發行者端,執行 sp_validatemergesubscription (Transact-SQL)。 指定 @publication@subscriber 的發行集、@subscriber_db 的訂閱者資料庫名稱,以及針對 @level 指定下列其中一個值:

    • 1 - 只驗證列數。
    • 3 - 驗證列數二進位總和檢查碼。

    這會標示選取的訂閱以供驗證。

  2. 針對每項訂閱啟動合併代理程式。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription

  3. 檢查代理程式輸出,以取得驗證的結果。

  4. 針對每個要驗證的訂閱重複步驟 1 到 3。

注意

您也可以在執行 Replication Merge Agent 時藉由指定 -Validate參數,在同步處理結束時驗證合併發行集的訂閱。

針對合併式發行集的所有發送訂閱

使用複寫監視器

  1. 在複寫監視器的左窗格中展開發行者群組,然後展開發行者。
  2. 以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證所有訂閱]
  3. [驗證所有訂閱] 對話方塊中,指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼)。
  4. 選取 [確定]。
  5. 按一下 [所有訂閱] 索引標籤。
  6. 檢視驗證結果。 針對每個發送訂閱:
    1. 如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]
    2. 以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]
    3. [同步處理記錄] 索引標籤上的 [所選取工作階段的最後訊息] 測試區域中檢視資訊。

使用 TRANSACT-SQL

  1. 在發行集資料庫的發行者端,執行 sp_validatemergepublication (Transact-SQL)。 針對 @level 指定 @publication 和下列其中一個值:

    • 1 - 只驗證列數。
    • 3 - 驗證列數二進位總和檢查碼。

    這會標示所有訂閱以供驗證。

  2. 針對每項訂閱啟動合併代理程式。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription

  3. 檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱 Validate Data at the Subscriber

使用合併代理程式參數來驗證資料

  1. 以下列其中一種方法,從命令提示字元啟動「合併代理程式」(在「訂閱者」端的為提取訂閱,在「散發者」端的則為發送訂閱)。

    • 針對 -Validate 參數,指定值 1 (列數) 或 3 (列數和二進位總和檢查碼)。
    • 針對 -ProfileName 參數,指定 rowcount validationrowcount and checksum validation

    如需相關資訊,請參閱 Synchronize a Pull SubscriptionSynchronize a Push Subscription

使用 Replication Management Objects (RMO)

複寫能讓您以程式設計的方式,使用 Replication Management Objects (RMO) 驗證「訂閱者」和「發行者」兩端的資料相符。 您使用的物件依照複寫拓撲的類型而定。 異動複寫需要驗證發行集的所有訂閱。

注意

如需範例,請參閱本主題稍後的 範例 (RMO)

若要驗證交易式發行集中所有發行項的資料

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 TransPublication 類別的執行個體。 設定發行集的 NameDatabaseName 屬性。 將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。

  3. 呼叫 LoadProperties 方法以取得物件的剩餘屬性。 如果此方法傳回 false,則表示步驟 2 中的發行集屬性定義不正確,或者該發行集不存在。

  4. 呼叫 ValidatePublication 方法。 傳遞下列項目:

    這會標示要驗證的發行項。

  5. 如果尚未執行,請啟動「散發代理程式」以同步處理每個訂閱。 如需相關資訊,請參閱 Synchronize a Push SubscriptionSynchronize a Pull Subscription。 驗證作業的結果會寫入至代理程式記錄。 如需詳細資訊,請參閱 Monitoring Replication

若要驗證所有合併發行集訂閱中的資料

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 MergePublication 類別的執行個體。 設定發行集的 NameDatabaseName 屬性。 將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。

  3. 呼叫 LoadProperties 方法以取得物件的剩餘屬性。 如果此方法傳回 false,則表示步驟 2 中的發行集屬性定義不正確,或者該發行集不存在。

  4. 呼叫 ValidatePublication 方法。 傳遞所要的 ValidationOption

  5. 為每個訂閱執行「合併代理程式」以啟動驗證,或等候下一個排程的代理程式執行。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription。 驗證作業的結果會寫入至代理程式記錄,您可使用「複寫監視器」來加以檢視。 如需詳細資訊,請參閱 Monitoring Replication

若要驗證合併發行集單一訂閱中的資料

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 MergePublication 類別的執行個體。 設定發行集的 NameDatabaseName 屬性。 將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。

  3. 呼叫 LoadProperties 方法以取得物件的剩餘屬性。 如果此方法傳回 false,則表示步驟 2 中的發行集屬性定義不正確,或者該發行集不存在。

  4. 呼叫 ValidateSubscription 方法。 傳遞正在進行驗證之「訂閱者」和訂閱資料庫的名稱以及所要的 ValidationOption

  5. 為訂閱執行「合併代理程式」以啟動驗證,或等候下一個排程的代理程式執行。 如需相關資訊,請參閱 Synchronize a Pull Subscription 以及 Synchronize a Push Subscription。 驗證作業的結果會寫入至代理程式記錄,您可使用「複寫監視器」來加以檢視。 如需詳細資訊,請參閱 Monitoring Replication

範例 (RMO)

此範例會標示交易式發行集的所有訂閱,以進行列數驗證。

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";

TransPublication publication;

// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for the publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // If we can't get the properties for this publication, 
    // throw an application exception.
    if (publication.LoadProperties())
    {
        // Initiate validataion for all subscriptions to this publication.
        publication.ValidatePublication(ValidationOption.RowCountOnly,
            ValidationMethod.ConditionalFast, false);

        // If not already running, start the Distribution Agent at each 
        // Subscriber to synchronize and validate the subscriptions.
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication. " +
            "Ensure that the publication {0} exists on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Do error handling here.
    throw new ApplicationException(
        "Subscription validation could not be initiated.", ex);
}
finally
{
    conn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"

Dim publication As TransPublication

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Set the required properties for the publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' If we can't get the properties for this publication, 
    ' throw an application exception.
    If publication.LoadProperties() Then

        ' Initiate validataion for all subscriptions to this publication.
        publication.ValidatePublication(ValidationOption.RowCountOnly, _
         ValidationMethod.ConditionalFast, False)

        ' If not already running, start the Distribution Agent at each 
        ' Subscriber to synchronize and validate the subscriptions.
    Else
        Throw New ApplicationException(String.Format( _
         "Settings could not be retrieved for the publication. " + _
         "Ensure that the publication {0} exists on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Do error handling here.
    Throw New ApplicationException( _
     "Subscription validation could not be initiated.", ex)
Finally
    conn.Disconnect()
End Try

此範例會標示合併式發行集的特定訂閱,以進行列數驗證。

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2022Replica";

MergePublication publication;

// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for the publication.
    publication = new MergePublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;


    // If we can't get the properties for this merge publication, then throw an application exception.
    if (publication.LoadProperties())
    {
        // Initiate validation of the specified subscription.
        publication.ValidateSubscription(subscriberName,
            subscriptionDbName, ValidationOption.RowCountOnly);
        
        // Start the Merge Agent to synchronize and validate the subscription.
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication. " +
            "Ensure that the publication {0} exists on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Do error handling here.
    throw new ApplicationException(String.Format(
        "The subscription at {0} to the {1} publication could not " +
        "be validated.", subscriberName, publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

Dim publication As MergePublication

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Set the required properties for the publication.
    publication = New MergePublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' If we can't get the properties for this merge publication, then throw an application exception.
    If publication.LoadProperties() Then
        ' Initiate validation of the specified subscription.
        publication.ValidateSubscription(subscriberName, _
         subscriptionDbName, ValidationOption.RowCountOnly)

        ' Start the Merge Agent to synchronize and validate the subscription.
    Else
        Throw New ApplicationException(String.Format( _
         "Settings could not be retrieved for the publication. " + _
         "Ensure that the publication {0} exists on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Do error handling here.
    Throw New ApplicationException(String.Format( _
     "The subscription at {0} to the {1} publication could not " + _
     "be validated.", subscriberName, publicationName), ex)
Finally
    conn.Disconnect()
End Try

另請參閱

Best Practices for Replication Administration