檢視和修改發行項屬性

適用於:SQL ServerAzure SQL 受控執行個體

此主題描述如何使用 SQL Server Management Studio、Transact-SQL 或 Replication Management Objects (RMO),檢視和修改 SQL Server 中的發行項屬性。

本主題內容

開始之前

限制事項

  • 有些屬性在建立了發行集後無法再修改,而另一些當存在發行集的訂閱時便無法修改。 無法修改的屬性以唯讀顯示。

建議

使用 SQL Server Management Studio

您可以在 [發行集屬性 - <發行集>] 對話方塊 (在 Microsoft SQL Server Management Studio 與複寫監視器中可用) 中,檢視及修改發行項屬性。 如需啟動複寫監視器的詳細資訊,請參閱啟動複寫監視器

  • [一般] 頁面包含發行集名稱和描述、發行集類型以及訂閱過期設定。

  • [發行項] 頁面對應「新增發行集精靈」中的 [發行項] 頁面。 此頁面用於新增及刪除發行項,以及變更發行項的屬性與資料行篩選。

  • [篩選資料列] 頁面對應「新增發行集精靈」中的 [篩選資料表的資料列] 頁面。 此頁面用於新增、編輯和刪除所有類型發行集的靜態資料列篩選,以及新增、編輯和刪除合併式發行集的參數化資料列篩選器和聯結篩選。

  • [快照集] 頁面允許您指定快照集的格式和位置、是否應壓縮快照集,以及套用快照集前後要執行的指令碼。

  • [FTP 快照集] 頁面 (針對快照式和交易式發行集,以及執行 SQL Server 2005 之前版本之「發行者」的合併式發行集) 允許您指定「訂閱者」是否可以透過「檔案傳輸通訊協定」(FTP) 下載快照集檔案。

  • [FTP 快照集和網際網路] 頁面 (針對執行 SQL Server 2005 或更新版本之「發行者」的合併式發行集) 允許您指定「訂閱者」是否可以透過 FTP 下載快照集檔案,以及「訂閱者」是否可以透過 HTTP 同步處理訂閱。

  • [訂閱選項] 頁面允許您設定套用至所有訂閱的一些選項。 選項視發行集類型的不同而不同。

  • [發行集存取清單] 頁面允許您指定可存取發行集的登入和群組。

  • [代理程式安全性] 頁面允許您存取執行以下代理程式之帳戶的設定,並與複寫拓撲中的電腦建立連接:所有發行集的「快照集代理程式」;所有交易式發行集的「記錄讀取器代理程式」;及允許佇列更新訂閱之交易式發行集的「佇列讀取器代理程式」。

  • [資料分割] 頁面 (針對執行 SQL Server 2005 或更新版本之「發行者」的合併式發行集) 允許您指定至含參數化篩選之發行集的「訂閱者」是否可以在一個快照集不可用時要求另一個快照集。 它還允許您為一個或多個資料分割一次性或按循環排程產生快照集。

若要檢視和修改發行項屬性

  1. 在 [發行集屬性 - <發行集>] 對話方塊的 [發行項] 頁面上,選取一個發行項,然後按一下 [發行項屬性]。

  2. 選取應套用發行項屬性變更的物件︰

    • 按一下 [設定反白顯示 <物件類型> 發行項的屬性],以啟動 [發行項屬性 - <物件名稱>] 對話方塊;在這個對話方塊中所做的屬性變更,只會套用至 [發行項] 頁面上的物件窗格中反白顯示的物件。

    • 按一下 [設定所有 <物件類型> 發行項的屬性],以啟動 [所有 <物件類型> 發行項的屬性] 對話方塊;在這個對話方塊中所做的屬性變更,會套用至 [發行項] 頁面上的物件窗格中屬於該類型的所有物件,包括尚未選取發行的物件。

      注意

      [所有 <物件類型> 發行項的屬性] 對話方塊中所做的屬性變更,會覆寫之前在 [發行項屬性 - <物件名稱>] 對話方塊中所做的任何變更。 例如,若要設定所有屬於某物件類型之發行項的一些預設值,但同時要設定個別物件的某些屬性,則請先設定所有發行項的預設值, 然後再設定個別物件的屬性。

  3. 必要時修改任何屬性,然後按一下 [確定]

  4. 在 [發行集屬性 - <發行集>] 對話方塊上,按一下 [確定]。

使用 TRANSACT-SQL

您可以使用複寫預存程序來以程式設計的方式修改發行項及傳回其屬性。 使用哪些預存程序要依發行項所屬的發行集類型而定。

檢視屬於快照式或交易式發行集之發行項的屬性

  1. 執行 sp_helparticle,針對 @publication 參數指定發行集的名稱,並針對 @article 參數指定發行項的名稱。 如果您不指定 @article,則會傳回發行集中所有發行項的資訊。

  2. 針對資料表發行項執行 sp_helparticlecolumns ,以列出基底資料表中可用的所有資料行。

修改屬於快照式或交易式發行集之發行項的屬性

  1. 執行 sp_changearticle,在 @property 參數中指定變更的發行項屬性,並在 @value 參數指定此屬性的新值。

    注意

    如果此變更需要產生新的快照集,您也必須針對 @force_invalidate_snapshot 指定 1 的值,且如果此變更需要重新初始化訂閱者,您也必須針對 @force_reinit_subscription 指定 1 的值。 如需當變更時需要新的快照集或重新初始化之屬性的詳細資訊,請參閱變更發行集與發行項屬性

檢視屬於合併式發行集之發行項的屬性

  1. 執行 sp_helpmergearticle,針對 @publication 參數指定發行集的名稱,並針對 @article 參數指定發行項的名稱。 如果您不指定這些參數,將會傳回發行集中或發行者上所有發行項的資訊。

  2. 針對資料表發行項執行 sp_helpmergearticlecolumn ,以列出基底資料表中可用的所有資料行。

修改屬於合併式發行集之發行項的屬性

  1. 執行 sp_changemergearticle,在 @property 參數中指定正在變更的發行項屬性,並在 @value 參數指定此屬性的新值。

    注意

    如果此變更需要產生新的快照集,您也必須針對 @force_invalidate_snapshot 指定 1 的值,且如果此變更需要重新初始化訂閱者,您也必須針對 @force_reinit_subscription 指定 1 的值。 如需當變更時需要新的快照集或重新初始化之屬性的詳細資訊,請參閱變更發行集與發行項屬性

範例 (Transact-SQL)

這個異動複寫範例會傳回已發行之發行項的屬性。

DECLARE @publication AS sysname;
SET @publication = N'AdvWorksProductTran';

USE [AdventureWorks2022]
EXEC sp_helparticle
  @publication = @publication;
GO

這個異動複寫範例會變更已發行之發行項的結構描述選項。

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @option AS int;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product';
SET @option = (SELECT CAST(0x0000000002030073 AS int));

-- Change the schema options to replicate schema with XML.
USE [AdventureWorks2022]
EXEC sp_changearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'schema_option', 
  @value = @option,
  @force_invalidate_snapshot = 1;
GO

這個合併式複寫範例會傳回已發行之發行項的屬性。

DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';

USE [AdventureWorks2022]
EXEC sp_helpmergearticle
  @publication = @publication;
GO

這個合併式複寫範例會變更已發行之發行項的衝突偵測設定。

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @article = N'SalesOrderHeader';

-- Enable column-level conflict tracking.
-- Changing this property requires that existing subscriptions
-- be reinitialized and that a new snapshot be generated.
USE [AdventureWorks2022]
EXEC sp_changemergearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'column_tracking', 
  @value = N'true',
  @force_invalidate_snapshot = 1,
  @force_reinit_subscription = 1;
GO

使用 Replication Management Objects (RMO)

您可以使用 Replication Management Objects (RMO) 以程式設計的方式修改發行項及存取其屬性。 用來檢視或修改發行項屬性的 RMO 類別,將取決於發行項所屬的發行集類型而定。

檢視或修改屬於快照式或交易式發行集之發行項的屬性

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

  2. 建立 TransArticle 類別的執行個體。

  3. 設定 NamePublicationNameDatabaseName 屬性。

  4. 針對 ConnectionContext 屬性設定步驟 1 中的連接。

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

  6. (選擇性) 若要變更屬性,請針對其中一個可設定的 TransArticle 屬性設定新的值。

  7. (選擇性) 如果您已針對 P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges 指定 CachePropertyChanges的值,請呼叫 CommitPropertyChanges 方法來認可伺服器上的變更。 如果您已針對 false 指定 CachePropertyChanges 的值 (預設值),則會立即將變更傳送到伺服器。

檢視或修改屬於合併式發行集之發行項的屬性

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

  2. 建立 MergeArticle 類別的執行個體。

  3. 設定 NamePublicationNameDatabaseName 屬性。

  4. 針對 ConnectionContext 屬性設定步驟 1 中的連接。

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

  6. (選擇性) 若要變更屬性,請針對其中一個可設定的 MergeArticle 屬性設定新的值。

  7. (選擇性) 如果您已針對 P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges 指定 CachePropertyChanges的值,請呼叫 CommitPropertyChanges 方法來認可伺服器上的變更。 如果您已針對 false 指定 CachePropertyChanges 的值 (預設值),則會立即將變更傳送到伺服器。

範例 (RMO)

此範例會變更合併發行項,以指定此發行項所使用的商務邏輯處理常式。

// Define the Publisher, publication, and article names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string articleName = "SalesOrderHeader";

// Set the friendly name of the business logic handler.
string customLogic = "OrderEntryLogic";

MergeArticle article = new MergeArticle();

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

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

    // Set the required properties for the article.
    article.ConnectionContext = conn;
    article.Name = articleName;
    article.DatabaseName = publicationDbName;
    article.PublicationName = publicationName;

    // Load the article properties.
    if (article.LoadProperties())
    {
        article.ArticleResolver = customLogic;
    }
    else
    {
        // Throw an exception of the article does not exist.
        throw new ApplicationException(String.Format(
        "{0} is not published in {1}", articleName, publicationName));
    }
    
}
catch (Exception ex)
{
    // Do error handling here and rollback the transaction.
    throw new ApplicationException(String.Format(
        "The business logic handler {0} could not be associated with " +
        " the {1} article.",customLogic,articleName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher, publication, and article names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim articleName As String = "SalesOrderHeader"

' Set the friendly name of the business logic handler.
Dim customLogic As String = "OrderEntryLogic"

Dim article As MergeArticle = New MergeArticle()

' 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 article.
    article.ConnectionContext = conn
    article.Name = articleName
    article.DatabaseName = publicationDbName
    article.PublicationName = publicationName

    ' Load the article properties.
    If article.LoadProperties() Then
        article.ArticleResolver = customLogic
    Else
        ' Throw an exception of the article does not exist.
        Throw New ApplicationException(String.Format( _
         "{0} is not published in {1}", articleName, publicationName))
    End If

Catch ex As Exception
    ' Do error handling here and rollback the transaction.
    Throw New ApplicationException(String.Format( _
     "The business logic handler {0} could not be associated with " + _
     " the {1} article.", customLogic, articleName), ex)
Finally
    conn.Disconnect()
End Try

另請參閱

為合併發行項實作商務邏輯處理常式
發行資料和資料庫物件
變更發行集與發行項屬性
Replication System Stored Procedures Concepts
Advanced Merge Replication Conflict Detection and Resolution