檢視和修改文章屬性

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

本主題內容

開始之前

限制與制約

  • 某些屬性無法在建立發行集之後修改,如果發行集有訂閱,則無法修改其他屬性。 不可修改的屬性會顯示為唯讀。

建議

使用 SQL Server Management Studio

在 [ 發行屬性 - <發行集> ] 對話框中檢視和修改文章屬性,該對話框可在 Microsoft SQL Server Management Studio 和復寫監視器中取得。 如需啟動複寫監視器的詳細資訊,請參閱啟動複寫監視器。

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

  • [ 文章 ] 頁面對應於 [新增文章精靈] 中的 [ 文章 ] 頁面。 使用此頁面來新增和刪除文章,以及變更文章的屬性和列篩選。

  • [篩選列] 頁面會對應至 [新增發行集精靈] 中的 [篩選表格列] 頁面。 使用此頁面來新增、編輯和刪除所有類型的發行集的靜態數據列篩選,以及新增、編輯和刪除合併式發行集的參數化數據列篩選和聯結篩選。

  • [ 快照 集] 頁面可讓您指定快照集的格式和位置、是否應該壓縮快照集,以及套用快照集前後要執行的腳本。

  • FTP 快照頁面(適用於快照發行和交易發行,以及適用於運行 SQL Server 2005 之前版本的發行者的合併發行),可讓您指定訂閱者是否可以通過檔案傳輸通訊協定 (FTP) 下載快照檔案。

  • FTP 快照集和因特網頁面(適用於執行 SQL Server 2005 或更新版本的發行者合併式發行集),可讓您指定訂閱者是否可以透過 FTP 下載快照集檔案,以及訂閱者是否可以透過 HTTPS 同步處理訂閱。

  • [ 訂用帳戶選項 ] 頁面可讓您設定套用至所有訂用帳戶的一些選項。 選項會根據發行集的類型而有所不同。

  • [ 發行集存取清單] 頁面可讓您指定哪些登入和群組可以存取發行集。

  • [ 代理程式安全性 ] 頁面可讓您存取執行下列代理程式並聯機到複寫拓撲中計算機之帳戶的設定:所有發行集的快照集代理程式;所有交易式發行集的記錄讀取器代理程式;和允許佇列更新訂閱之交易式發行集的佇列讀取器代理程式。

  • [資料分割] 頁面(適用於執行 SQL Server 2005 或更新版本的發行者合併出版物),可讓您指定發行集中具有參數化過濾器的訂閱者在快照集不可用時是否可以提出要求。 它也可讓您針對一或多個分割區產生快照集,無論是一次還是週期性排程。

檢視和修改文章屬性

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

  2. 選擇應套用屬性變更的文章:

    • 點擊 [ 設定所選取 <ObjectType> 文章的屬性 ] 可開啟 [ 文章屬性 - <ObjectName> ] 對話框;在此對話框中進行的屬性變更僅適用於 [ 文章 ] 頁面物件窗格中所選取的物件。

    • 單擊 設定所有 <ObjectType> 發行項的屬性,以啟動 所有 <ObjectType> 發行項的屬性 對話框;在此對話框中進行的屬性變更將套用至 [發行項] 頁面上的物件窗格中該類型的所有物件,包括尚未選取以發布的物件。

      備註

      [ 所有 <ObjectType> 發行項的屬性 ] 對話框中所做的屬性變更會覆寫先前在 [ 發行項屬性 - <ObjectName> ] 對話框中所做的任何變更。 例如,如果您想要為物件類型的所有發行項設定一些預設值,但也想要設定個別物件的某些屬性,請先設定所有發行項的預設值。 然後設定個別對象的屬性。

  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 [AdventureWorks2012]
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 [AdventureWorks2012]
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 [AdventureWorks2012]
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 [AdventureWorks2012]
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)

您可以使用複寫管理物件 (RMO) 以程式設計方式修改發行項並存取其屬性。 您用來檢視或修改發行項屬性的 RMO 類別,取決於發行項所屬的發行集類型。

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

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

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

  3. 設定 Name、 PublicationName和 DatabaseName 屬性。

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

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

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

  7. (選擇性)如果您為 指定的值trueCachePropertyChanges,請呼叫 CommitPropertyChanges 方法,以認可伺服器上的變更。 如果您為 指定的值 falseCachePropertyChanges (預設值),則會立即將變更傳送至伺服器。

查看或更改屬於合併出版物的文章屬性

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

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

  3. 設定 Name、 PublicationName和 DatabaseName 屬性。

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

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

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

  7. (選擇性)如果您為 指定的值trueCachePropertyChanges,請呼叫 CommitPropertyChanges 方法,以認可伺服器上的變更。 如果您為 指定的值 falseCachePropertyChanges (預設值),則會立即將變更傳送至伺服器。

範例 (RMO)

此範例會變更合併發行項,以指定發行項所使用的商業規則處理程式。

// Define the Publisher, publication, and article names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2012";
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 = "AdventureWorks2012"
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

另請參閱

為合併文章實作業務邏輯處理程序
發行資料和資料庫物件
變更出版物和文章屬性
復寫系統預存程式概念
進階的合併複製衝突檢測與解析