發布資料與資料庫物件

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

在建立發行集時,您可以選擇想要發行的資料表和其他資料庫物件。 您可以使用複寫發行下列資料庫物件。

資料庫物件 快照複寫和交易式複寫 合併式複寫
資料表 X X
分區資料表 X X
預存程序 - 定義 (Transact-SQL 和 CLR) X X
預存程序 - 執行 (Transact-SQL 和 CLR) X 否
視圖 X X
索引檢視 X X
將已建立索引的檢視表視為資料表 X 否
使用者自訂類型 (CLR) X X
使用者自訂的函數 (Transact-SQL 和 CLR) X X
別名資料類型 X X
全文索引 X X
結構描述物件 (條件約束、索引、使用者 DML 觸發程序、擴充屬性和定序) X X

建立出版物

要製作出版品,請提供以下資訊:

  • 經銷商。
  • 快照檔案的位置。
  • 出版資料庫。
  • 要建立之發行集的類型 (快照式、交易式、具有可更新訂閱的交易式,或合併式)。
  • 要包含在發行集中的資料和資料庫物件(發行項目)。
  • 適用於所有類型發行集的靜態資料列篩選和資料行篩選,以及適用於合併式發行集的參數化資料列篩選和聯結篩選。
  • 快照代理程式排程。
  • 執行下列代理程式所使用的帳戶:所有發行集的快照代理程式;所有異動發行集的記錄讀取器代理程式;允許更新訂閱之異動發行集的佇列讀取器代理程式。
  • 出版品的名稱和描述。

關於如何與出版物合作的資訊,請參閱以下文章:

注意

刪除文章或出版物並不會移除訂閱者的物件。

發佈資料表

最常見的已發行物件是資料表。 以下連結提供更多關於出版表格的資訊:

當你發佈一個供複製的表格時,你可以指定要複製給訂閱者的結構物件,例如宣告的參照完整性(主鍵限制、參考限制、唯一限制)、索引、使用者 DML 觸發器(DDL 觸發器無法複製)、擴展屬性和整合。 只在發行者與訂閱者之間的初始同步處理中複寫擴充屬性。 如果您在初始同步之後新增或修改擴充屬性,該變更將不會被同步。

若要指定結構描述選項,請參閱指定結構描述選項或 SchemaOption。

分區資料表與索引

複製支援發佈分割資料表與索引。 支援程度取決於你使用的複製類型,以及你為出版品和與分割資料表相關的文章所指定的選項。 如需更多資訊,請參閱複寫分割資料表和索引。

發佈預存程序

所有類型的複製都允許你複製儲存程序定義:該 CREATE PROCEDURE 語句會被複製到每個 Subscriber。 在使用 Common Language Runtime (CLR) 預存程序時,還將複製相關組件。 程序的變更會複製到訂閱者;對相關組件的變更則不會。

除複寫預存程序的定義外,異動複寫還可讓您複寫預存程序的執行。 此功能對於重現影響大量資料的維護導向儲存程序結果非常有用。 如需詳細資訊,請參閱 在交易式複寫中發行預存程序執行。

發佈檢視表

所有類型的複寫都可讓您複寫檢視。 你可以將檢視圖及其附帶的索引(如果是索引檢視)複製給訂閱者,但你也必須複製基底表。

對於索引檢視表,交易式複寫也允許您將索引檢視表複寫為資料表,而非檢視,因此也就不需要另外複寫基礎資料表。 若要執行此操作,請為 sp_addarticle (Transact-SQL) 的 @type 參數指定 "indexed view logbased" 選項之一。 如需使用 sp_addarticle 的詳細資訊,請參閱定義發行項。

發佈使用者自訂函式

CREATE FUNCTION CLR 函數與 Transact-SQL 函數的語句會被複製給每個訂閱者。 如果使用 CLR 函數,還將複製相關組件。 函式的變更會被複製到訂閱者;但相關組件的變更則不會。

發行使用者自訂類型和別名資料類型

複製會將使用使用者定義類型或別名資料類型的欄位視為其他欄位,並將其複製給訂閱者。 此程序會在建立資料表之前,於訂閱者端對每個複寫類型執行 CREATE TYPE 陳述式。 對於使用者定義型別,複製也會將相關的組合複製給每個訂閱者。 複製不會將使用者定義型別的變更及別名資料型別複製給訂閱者。

如果你在資料庫中定義了型別,但在建立出版品時卻沒有在任何欄位中引用它,複製系統就不會將該型別複製給訂閱者。 如果您之後在資料庫中建立了該型別的資料行,並想要對其進行複寫,則必須先手動將該型別(以及使用者定義型別的相關組件)複製到每個訂閱者。

發布全文索引

該 CREATE FULLTEXT INDEX 聲明會被複製給每位訂閱者,並於訂閱者處建立完整文字索引。 對 ALTER FULLTEXT INDEX 全文索引所做的變更不會被複製。

對已發佈物件進行綱要變更

複寫支援對已發行物件進行大範圍的結構描述變更。 當你在SQL Server Publisher對適當的已發佈物件做以下任何結構變更時,複製會預設將該變更傳遞給所有SQL Server訂閱者:

  • ALTER TABLE

  • ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

如需詳細資訊,請參閱對發行集資料庫進行結構描述變更。

出版考量

發佈資料庫物件時請考慮以下事項:

  • 使用者可以在出版物建立及初始快照時存取資料庫,但最好在 Publisher 活動較少時建立出版物。

  • 你在資料庫建立出版品後,無法重新命名。 要重新命名資料庫,必須先從資料庫中移除複製功能。

  • 如果你發佈的資料庫物件依賴一個或多個其他資料庫物件,你必須發佈所有被引用的物件。 例如,如果您發佈了一個相依於某個資料表的檢視表,則也必須一併發佈該資料表。

    注意

    如果你將文章加入合併出版,而現有文章依賴於新文章,你必須使用sp_addmergearticle和sp_changemergearticle的@processing_order參數來指定兩篇文章的處理順序。 請考慮以下情境:你發佈了一個表格,但沒有發佈該表格所引用的函式。 如果您未發行該函式,便無法在訂閱者端建立該資料表。 當您將函數加入至發行集時:將 sp_addmergearticle 的 @processing_order 參數值指定為 1;將 sp_changemergearticle 的 @processing_order 參數值指定為 2,指定 @article參數的資料表名稱。 此處理順序可確保您先在「訂閱者」端建立函數之後才建立相依於此函數的資料表。 您可對每個發行項使用不同的編號,只要函數的編號低於資料表的編號即可。

  • 出版名稱不得包含以下字元:% * [ ] |: " ? \ / <>。

發佈物件的限制

  • 你能發表的文章和專欄數量會依出版類型而異。 如需詳細資訊,請參閱 SQL Server 的最大容量規格的<複寫物件>一節。

  • 你無法將以加密方式定義的儲存程序、檢視、觸發器及使用者定義函式發佈,作為 SQL Server 複製的一部分。

  • 你可以複製 XML 架構集合,但變更在初始快照後不會被複製。

  • 針對交易式複寫發行的資料表必須具有主索引。 如果資料表位於交易複製發佈中,你無法停用任何與主鍵欄位相關的索引。 複製需要這些索引。 若要停用索引,您必須先將資料表從發行集中移除。

  • 用 sp_bindefault(Transact-SQL )建立的綁定預設不會被複製(綁定預設會被棄用,改用關鍵字 DEFAULT 或 ALTER TABLECREATE TABLE建立的預設)。

  • 你無法將包含 NOEXPAND 提示的函式與參考資料表和索引檢視在同一個發佈品中發佈,因為分發代理的傳遞順序不同。 若要解決此問題,請將資料表和索引檢視表的建立放在第一個發行集中,然後再將索引檢視表上含有 NOEXPAND 提示的函數加入在第一個發行集完成後發行的第二個發行集。 或者,使用 sp_addpublication 的 @post_snapshot_script參數,為這些函數建立指令碼,並傳遞指令碼。

結構描述和物件擁有權

針對結構描述和物件擁有權,複寫在新增複寫精靈中具有下列預設行為:

  • 對於相容性層級為 90 或更高的合併發行集中的文章、快照發行集和交易式發行集:依預設,訂閱者端的物件擁有者與發行者端對應物件的擁有者相同。 如果擁有物件的結構描述在訂閱者端不存在,則會自動建立。

  • 針對相容性層級低於 90 的合併發行中的發行項:依預設,擁有者會保留空白,並在訂閱者端建立物件時指定為 dbo。

  • 針對 Oracle 發行集內的發行項:依預設,會將擁有者指定為 dbo。

  • 對於發行集中使用字元模式快照的文章 (此模式用於非 SQL Server 訂閱者和 SQL Server Compact 訂閱者):依預設,擁有者會保留空白。 擁有者預設為與散發代理程式或合併代理程式用於連接到訂閱者之帳戶相關聯的擁有者。

你可以透過 文章屬性 - <文章> 對話框以及以下儲存程序( sp_addarticle、 sp_addmergearticle、 sp_changearticle 和 sp_changemergearticle)來更改物件擁有者。 如需詳細資訊,請參閱檢視和修改發行集屬性、定義發行項和檢視和修改發行項屬性。

將資料發行給執行舊版 SQL Server 的訂閱者

  • 如果你發佈給使用舊版 SQL Server 的訂閱者,功能就受限於該版本。 此限制適用於複製專屬功能及產品整體功能。

  • 合併出版品使用相容性等級,決定你可以在出版品中使用哪些功能,並讓你能支援使用舊版 SQL Server 的訂閱者。

在多個出版物中發表表格

複製支援在多個出版物中發表文章,包括重新發布資料,但有以下限制:

  • 如果你同時在交易性出版物和合併出版物中發表文章,請將合併文章的 @published_in_tran_pub 屬性設為 TRUE。 如需設定屬性的詳細資訊,請參閱檢視和修改發行集屬性和檢視和修改發行項屬性。

    若文章屬於交易訂閱且包含於合併出版中,請設定 @published_in_tran_pub 屬性。 根據預設,交易式複寫會假設訂閱者端的資料表為唯讀。 若合併複寫在交易訂閱中對資料表進行資料變更,資料可能發生不融合。 為避免此問題,請在合併發表中指定任何此類資料表為僅下載。 此設定可防止合併訂閱者將資料變更上傳至資料表。 如需詳細資訊,請參閱使用僅限下載的發行項最佳化合併式複寫效能。

  • 您無法同時將某篇文章發佈在合併式發行集與具有佇列更新訂閱的交易式發行集中。

  • 你無法重新發布包含在支援更新訂閱的交易性出版物中的文章。

  • 如果您在多個支援排隊更新訂閱的交易型出版物中發表文章,該文章在以下屬性中必須在所有出版物中具有相同價值:

    屬性 sp_addarticle 中的參數
    識別範圍管理 @auto_identity_range(已淘汰)與 @identityrangemangementoption
    發佈者識別碼範圍 @pub_identity_range
    識別範圍 @identity_range
    識別範圍臨界值 @threshold

    如需這些參數的詳細資訊,請參閱 sp_addarticle (Transact-SQL)。

  • 如果你在多個合併出版物中發表文章,該文章在以下屬性中必須在所有出版物中具有相同的價值:

    屬性 sp_addmergearticle 中的參數
    欄追蹤 @column_tracking
    結構定義選項 @schema_option
    欄篩選 @vertical_partition
    訂閱者上傳選項 @subscriber_upload_options
    有條件刪除追蹤 @delete_tracking
    錯誤補償 @compensate_for_errors
    識別範圍管理 @auto_identity_range(已淘汰)與 @identityrangemangementoption
    發佈者識別碼範圍 @pub_identity_range
    識別範圍 @identity_range
    識別範圍臨界值 @threshold
    分割區選項 @partition_options
    Blob 資料行串流 @stream_blob_columns
    篩選類型 @filter_type ( sp_addmergefilter中的參數)

    如需這些參數的詳細資訊,請參閱 sp_addmergearticle (Transact-SQL) 和 sp_addmergefilter (Transact-SQL)。

  • 交易複製與無過濾合併複製支援在多個出版物中發布一個資料表,然後在訂閱資料庫中的單一資料表內訂閱(通常稱為匯集情境)。 Rollup 常用於將來自多個地點的資料子集聚合於中央訂閱者的一個資料表中。 篩選合併出版品不支援中央訂閱者情境。 對於合併複製,彙整通常透過單一發佈文件實現,並使用參數化的列過濾器。 如需詳細資訊,請參閱< 參數化資料列篩選器>。