Share via


驗證訂閱者端的資料

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

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

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

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

  3. 檢視驗證結果:

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

    • 在 Management Studio 的 [檢視同步處理的狀態] 對話方塊中。

本主題內容

  • 開始之前:

    限制事項

  • 若要驗證訂閱者端的資料,請使用:

    SQL Server Management Studio

    Transact-SQL

    Replication Management Objects (RMO)

開始之前

限制事項

  • 「複寫監視器」的程序僅用於發送訂閱,因為發送訂閱無法在「複寫監視器」中同步。 但是,您可以標示要驗證的訂閱,並在「複寫監視器」中檢視發送訂閱的驗證結果。

  • 驗證結果會指示驗證成功或失敗,但不會在驗證失敗時指定失敗的資料列。 若要比較「發行者」和「訂閱者」端的資料,請使用 tablediff 公用程式。 如需使用此公用程式處理複寫資料的詳細資訊,請參閱<比較複寫資料表的差異 (複寫程式設計)>。

搭配回到頁首連結使用的箭頭圖示[Top]

使用 SQL Server Management Studio

若要驗證交易式發行集之訂閱的資料 (Management Studio)

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

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

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

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

    • 選取 [驗證所有的 SQL Server 訂閱]

    • 選取 [驗證下列訂閱],然後選取一或多個訂閱。

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

  6. 按一下 [確定]。

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

    1. 展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]

    2. 如果代理程式尚未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動]。 對話方塊就會顯示關於驗證的參考用訊息。

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

若要驗證合併式發行集之單一訂閱的資料 (Management Studio)

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

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

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

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

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

  6. 按一下 [確定]。

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

    1. 展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]

    2. 如果代理程式未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動]。 對話方塊就會顯示關於驗證的參考用訊息。

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

若要驗證合併式發行集之所有訂閱的資料 (Management Studio)

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

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

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

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

  5. 按一下 [確定]。

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

    1. 展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]

    2. 如果代理程式未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動]。 對話方塊就會顯示關於驗證的參考用訊息。

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

若要驗證交易式發行集之所有發送訂閱的資料 (複寫監視器)

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

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

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

    • 選取 [驗證所有的 SQL Server 訂閱]

    • 選取 [驗證下列訂閱],然後選取一或多個訂閱。

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

  5. 按一下 [確定]。

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

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

    1. 如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]

    2. 以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]

    3. 檢視 [所選取工作階段中的動作] 文字區域之 [散發者到訂閱者記錄] 索引標籤中的資訊。

若要驗證合併式發行集之單一發送訂閱的資料 (複寫監視器)

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

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

  3. 以滑鼠右鍵按一下您要驗證的訂閱,然後按一下 [驗證單一訂閱]

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

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

  6. 按一下 [確定]。

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

  8. 檢視驗證結果:

    1. 如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]

    2. 以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]

    3. [同步處理記錄] 索引標籤上的 [所選取工作階段的最後訊息] 測試區域中檢視資訊。

若要驗證合併式發行集之所有發送訂閱的資料 (複寫監視器)

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

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

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

  4. 按一下 [確定]。

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

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

    1. 如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]

    2. 以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]

    3. [同步處理記錄] 索引標籤上的 [所選取工作階段的最後訊息] 測試區域中檢視資訊。

搭配回到頁首連結使用的箭頭圖示[Top]

使用 Transact-SQL

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

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

    • 1 - 只限列數檢查 (預設值)

    • 2 - 列數及二進位總和檢查碼。

    [!附註]

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

  2. (選擇性) 針對每個訂閱啟動「散發代理程式」(如果尚未執行)。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。

  3. 檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證複寫的資料>。

若要驗證交易式發行集中單一發行項的資料

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

    • 1 - 只限列數檢查 (預設值)

    • 2 - 列數及二進位總和檢查碼。

    [!附註]

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

  2. (選擇性) 針對每個訂閱啟動「散發代理程式」(如果尚未執行)。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。

  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. (選擇性) 啟動「散發代理程式」(如果尚未執行)。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。

  8. 檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證訂閱者端的資料>。

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

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

    • 1 - 只驗證列數。

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

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

  2. 針對每項訂閱啟動「合併代理程式」。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。

  3. 檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證訂閱者端的資料>。

若要驗證選取的合併發行集訂閱中的資料

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

    • 1 - 只驗證列數。

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

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

  2. 針對每項訂閱啟動合併代理程式。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。

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

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

[!附註]

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

若要使用合併代理程式參數驗證訂閱中的資料

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

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

    • 針對 -ProfileName 參數,指定 rowcount validationrowcount and checksum validation

    如需詳細資訊,請參閱<同步處理提取訂閱>或<同步處理發送訂閱>。

搭配回到頁首連結使用的箭頭圖示[Top]

使用 Replication Management Objects (RMO)

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

[!附註]

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

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

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

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

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

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

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

  5. 如果尚未執行,請啟動「散發代理程式」以同步處理每個訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>或<同步處理提取訂閱>。 驗證作業的結果會寫入至代理程式記錄。 如需詳細資訊,請參閱<監視複寫>。

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

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

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

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

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

  5. 為每個訂閱執行「合併代理程式」以啟動驗證,或等候下一個排程的代理程式執行。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。 驗證作業的結果會寫入至代理程式記錄,您可使用「複寫監視器」來加以檢視。 如需詳細資訊,請參閱<監視複寫>。

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

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

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

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

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

  5. 為訂閱執行「合併代理程式」以啟動驗證,或等候下一個排程的代理程式執行。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。 驗證作業的結果會寫入至代理程式記錄,您可使用「複寫監視器」來加以檢視。 如需詳細資訊,請參閱<監視複寫>。

範例 (RMO)

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

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

            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 = "AdventureWorks2012"

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 = "AdventureWorks2012";
            string subscriberName = subscriberInstance;
            string subscriptionDbName = "AdventureWorks2012Replica";

            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 = "AdventureWorks2012"
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

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

搭配回到頁首連結使用的箭頭圖示[Top]