sp_addmergepublication (Transact-SQL)

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

建立新的合併式發行集。 這個預存程式會在發行之資料庫的發行者端執行。

Transact-SQL 語法慣例

語法

sp_addmergepublication
    [ @publication = ] N'publication'
    [ , [ @description = ] N'description' ]
    [ , [ @retention = ] retention ]
    [ , [ @sync_mode = ] N'sync_mode' ]
    [ , [ @allow_push = ] N'allow_push' ]
    [ , [ @allow_pull = ] N'allow_pull' ]
    [ , [ @allow_anonymous = ] N'allow_anonymous' ]
    [ , [ @enabled_for_internet = ] N'enabled_for_internet' ]
    [ , [ @centralized_conflicts = ] N'centralized_conflicts' ]
    [ , [ @dynamic_filters = ] N'dynamic_filters' ]
    [ , [ @snapshot_in_defaultfolder = ] N'snapshot_in_defaultfolder' ]
    [ , [ @alt_snapshot_folder = ] N'alt_snapshot_folder' ]
    [ , [ @pre_snapshot_script = ] N'pre_snapshot_script' ]
    [ , [ @post_snapshot_script = ] N'post_snapshot_script' ]
    [ , [ @compress_snapshot = ] N'compress_snapshot' ]
    [ , [ @ftp_address = ] N'ftp_address' ]
    [ , [ @ftp_port = ] ftp_port ]
    [ , [ @ftp_subdirectory = ] N'ftp_subdirectory' ]
    [ , [ @ftp_login = ] N'ftp_login' ]
    [ , [ @ftp_password = ] N'ftp_password' ]
    [ , [ @conflict_retention = ] conflict_retention ]
    [ , [ @keep_partition_changes = ] N'keep_partition_changes' ]
    [ , [ @allow_subscription_copy = ] N'allow_subscription_copy' ]
    [ , [ @allow_synctoalternate = ] N'allow_synctoalternate' ]
    [ , [ @validate_subscriber_info = ] N'validate_subscriber_info' ]
    [ , [ @add_to_active_directory = ] N'add_to_active_directory' ]
    [ , [ @max_concurrent_merge = ] max_concurrent_merge ]
    [ , [ @max_concurrent_dynamic_snapshots = ] max_concurrent_dynamic_snapshots ]
    [ , [ @use_partition_groups = ] N'use_partition_groups' ]
    [ , [ @publication_compatibility_level = ] N'publication_compatibility_level' ]
    [ , [ @replicate_ddl = ] replicate_ddl ]
    [ , [ @allow_subscriber_initiated_snapshot = ] N'allow_subscriber_initiated_snapshot' ]
    [ , [ @allow_web_synchronization = ] N'allow_web_synchronization' ]
    [ , [ @web_synchronization_url = ] N'web_synchronization_url' ]
    [ , [ @allow_partition_realignment = ] N'allow_partition_realignment' ]
    [ , [ @retention_period_unit = ] N'retention_period_unit' ]
    [ , [ @generation_leveling_threshold = ] generation_leveling_threshold ]
    [ , [ @automatic_reinitialization_policy = ] automatic_reinitialization_policy ]
    [ , [ @conflict_logging = ] N'conflict_logging' ]
[ ; ]

引數

[ @publication = ] N'publication'

要建立之合併式發行集的名稱。 @publication是 sysname,沒有預設值,而且不得為 關鍵詞 ALL。 發行集的名稱在資料庫中必須是唯一的。

[ @description = ] N'description'

發行集描述。 @description為 nvarchar(255),預設值為 NULL

[ @retention = ] 保留期

保留期間,以保留期間單位為單位,用來儲存指定 @publication的變更。 @retention為 int,預設值為 14。 保留期間單位是由 @retention_period_unit所定義。 如果訂閱未在保留期間內同步處理,且其收到的擱置變更會由散發者端的清除作業移除,則訂閱會過期,且必須重新初始化。 允許的最大保留期間是9999年12月31日和目前日期之間的天數。

注意

合併式發行集的保留期限具有 24 小時寬限期,可配合不同時區的「訂閱者」。 例如,如果您設定的保留期限是一天,實際的保留期限便是 48 小時。

[ @sync_mode = ] N'sync_mode'

訂閱者初始同步處理至發行集的模式。 @sync_mode為 nvarchar(10),而且可以是下列其中一個值。

Description
native (預設值) 產生所有數據表的原生模式大量複製程序輸出。
character 產生所有數據表的字元模式大量複製程序輸出。 支援 SQL Server Compact 和非 SQL Server 訂閱者的必要專案。

[ @allow_push = ] N'allow_push'

指定是否可以為指定的發行集建立發送訂閱。 @allow_push為 nvarchar(5),預設值true為 ,允許發行集上的發送訂閱。

[ @allow_pull = ] N'allow_pull'

指定是否可以為指定的發行集建立提取訂閱。 @allow_pull是 nvarchar(5),預設值true為 ,允許發行集上的提取訂閱。 您必須指定 true 以支援 SQL Server Compact Subscribers。

[ @allow_anonymous = ] N'allow_anonymous'

指定是否可以為指定的發行集建立匿名訂閱。 @allow_anonymous為 nvarchar(5),預設值true為 ,允許發行集上的匿名訂閱。 若要支援 SQL Server Compact 訂閱者,您必須指定 true

[ @enabled_for_internet = ] N'enabled_for_internet'

指定是否為因特網啟用發行集,並判斷是否可以使用檔案傳輸通訊協定 (FTP) 將快照集檔案傳送給訂閱者。 @enabled_for_internet為 nvarchar(5),預設值為 false。 如果 true為 ,則發行集的同步處理檔案會放入 C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL.x\Repldata\Ftp 目錄中。 用戶必須建立 Ftp 目錄。 如果 false為 ,則不會啟用發行集以進行因特網存取。

[ @centralized_conflicts = ] N'centralized_conflicts'

此參數已被取代,而且會維護腳本的回溯相容性。 使用 @conflict_logging 來指定儲存衝突記錄的位置。

[ @dynamic_filters = ] N'dynamic_filters'

可讓合併式發行集使用參數化數據列篩選。 @dynamic_filters為 nvarchar(5),預設值為 false

注意

您不應該指定此參數,而是允許 SQL Server 自動判斷是否使用參數化數據列篩選。 如果您為 @dynamic_filters 指定 值true,則必須定義發行項的參數化數據列篩選。 如需詳細資訊,請參閱 針對合併發行項定義及修改參數化資料列篩選

[ @snapshot_in_defaultfolder = ] N'snapshot_in_defaultfolder'

指定快照集檔案是否儲存在預設資料夾中。 @snapshot_in_defaultfolder為 nvarchar(5),預設值為 true。 如果 true為 ,則可以在預設資料夾中找到快照集檔案。 如果false為 ,快照集檔案會儲存在@alternate_snapshot_folder指定的替代位置。 替代位置可以位於另一部伺服器、網路驅動器機或卸載式媒體上(例如CD-ROM或卸載式磁碟)。 您也可以將快照集檔案儲存到檔案傳輸通訊協定 (FTP) 網站,以供訂閱者稍後擷取。 此參數可以是 true,而且仍然有@alt_snapshot_folder指定的位置。 此組合會指定快照集檔案會同時儲存在預設和替代位置。

[ @alt_snapshot_folder = ] N'alt_snapshot_folder'

指定快照集替代資料夾的位置。 @alt_snapshot_folder為 nvarchar(255),預設值為 NULL

[ @pre_snapshot_script = ] N'pre_snapshot_script'

指定檔案位置的 .sql 指標。 @pre_snapshot_script為 nvarchar(255),預設值為 NULL。 合併代理程式 在訂閱者端套用快照集時,會在任何復寫的物件腳本之前執行預先快照集腳本。 腳本會在連接到訂用帳戶資料庫時,合併代理程式 所使用的安全性內容中執行。 預先快照集腳本不會在 SQL Server Compact 訂閱者上執行。

[ @post_snapshot_script = ] N'post_snapshot_script'

指定檔案位置的 .sql 指標。 @post_snapshot_script為 nvarchar(255),預設值為 NULL。 合併代理程式 會在初始同步處理期間套用所有其他複寫的物件腳本和數據之後,執行快照集後腳本。 腳本會在連線到訂用帳戶資料庫時,合併代理程式 所使用的安全性內容中執行。 快照集後腳本不會在 SQL Server Compact 訂閱者上執行。

[ @compress_snapshot = ] N'compress_snapshot'

指定寫入@alt_snapshot_folder位置的快照集將會壓縮成 Microsoft CAB 格式。 @compress_snapshot為 nvarchar(5),預設值為 false

  • false 指定快照集不會壓縮。

  • true 指定將壓縮快照集。

無法壓縮大於 2 GB 的快照集檔案。 壓縮快照集檔案會在執行 合併代理程式 的位置取消壓縮;提取訂閱通常會與壓縮的快照集搭配使用,如此一來,檔案就會在訂閱者端取消壓縮。 預設資料夾中的快照集無法壓縮。 若要支援 SQL Server Compact 訂閱者,您必須指定 false

[ @ftp_address = ] N'ftp_address'

散發者 FTP 服務的網路位址。 @ftp_address為 sysname,預設值為 NULL。 指定發行集快照集檔案的位置,供訂閱者 合併代理程式 取用。 由於此屬性會針對每個發行集儲存,因此每個發行集可以有不同的 @ftp_address。 發行集必須支援使用 FTP 傳播快照集。

[ @ftp_port = ] ftp_port

散發者的 FTP 服務埠號碼。 @ftp_port為 int,預設值為 21。 指定要挑選訂閱者之 合併代理程式 發行集快照集檔案的位置。 由於此屬性會針對每個發行集儲存,因此每個發行集可以有自己的 @ftp_port

[ @ftp_subdirectory = ] N'ftp_subdirectory'

指定當發行集支援使用 FTP 傳播快照集時,訂閱者 合併代理程式 可以挑選快照集檔案的位置。 @ftp_subdirectory為 nvarchar(255),預設值為 ftp。 由於此屬性會針對每個發行集儲存,因此每個發行集可以有自己的 @ftp_subdirctory 或選擇沒有子目錄,以 NULL 值表示。

針對具有參數化篩選的發行集預先產生快照集時,每個訂閱者數據分割的數據快照集必須位於自己的資料夾中。 使用 FTP 預先產生快照集的目錄結構必須遵循下列結構:

<alternate_snapshot_folder>\ftp\<publisher_publicationDB_publication>\<partitionID>.

注意

上一個範例中的值(以角括弧表示)取決於發行集和訂閱者數據分割的特定數據。

[ @ftp_login = ] N'ftp_login'

用來連線到 FTP 服務的用戶名稱。 @ftp_login為 sysname 預設值為 anonymous

[ @ftp_password = ] N'ftp_password'

用來連線到 FTP 服務的用戶密碼。 @ftp_password為 sysname,預設值為 NULL

重要

請勿使用空白密碼。 使用強密碼

[ @conflict_retention = ] conflict_retention

指定保留期間,以天為單位保留衝突。 @conflict_retention為 int,衝突數據列從衝突數據表清除前的預設值為14天。

[ @keep_partition_changes = ] N'keep_partition_changes'

指定當無法使用預先計算的數據分割時,是否要啟用分割區變更優化。 @keep_partition_changes為 nvarchar(5),預設值為 true

  • false 表示分割區變更不會優化,而且未使用預先計算的數據分割時,傳送給所有訂閱者的數據分割會在數據分割中的數據變更時進行驗證。

  • true 表示分割區變更已優化,且只會影響在變更數據分割中有數據列的訂閱者。

使用預先計算的數據分割時,請將 @use_partition_groups 設定true ,並將 @keep_partition_changes 設定false 如需詳細資訊,請參閱 參數化篩選 - 針對預先計算的數據分割進行優化。

注意

如果您針對 @keep_partition_changes 指定的值true,請為 快照集代理程式 參數-MaxNetworkOptimization指定 的值1 如需此參數的詳細資訊,請參閱複寫 快照集代理程式。 如需如何指定代理程序參數的資訊,請參閱複寫代理程式 管理員 istration

使用 SQL Server Compact 訂閱者時,@keep_partition_changes必須設定為 true ,以確保正確傳播刪除。 當設定為 false時,訂閱者的數據列可能超出預期。

[ @allow_subscription_copy = ] N'allow_subscription_copy'

啟用或停用複製訂閱此發行集的訂閱資料庫的能力。 @allow_subscription_copy為 nvarchar(5),預設值為 false。 要複製的訂閱資料庫大小必須小於 2 GB。

[ @allow_synctoalternate = ] N'allow_synctoalternate'

僅供參考之用。 不支援。 我們無法保證未來的相容性。

[ @validate_subscriber_info = ] N'validate_subscriber_info'

列出使用參數化數據列篩選時,用來定義已發行數據的訂閱者數據分割的函式。 @validate_subscriber_info為 nvarchar(500),預設值為 NULL。 合併代理程式 會使用此資訊來驗證訂閱者的分割區。 例如,如果在 參數化數據列篩選中使用SUSER_SNAME ,則參數應該是 @validate_subscriber_info=N'SUSER_SNAME()

注意

您不應該指定此參數,而是允許 SQL Server 自動判斷篩選準則。

[ @add_to_active_directory = ] N'add_to_active_directory'

此參數已被取代,而且會維護腳本的回溯相容性。 您無法再將發行集資訊新增至 Microsoft Active Directory。

[ @max_concurrent_merge = ] max_concurrent_merge

並行合併進程的最大數目。 @max_concurrent_merge為 int,預設值為 0。 的 值 0 表示在任何指定時間執行的並行合併進程數目沒有限制。

這個屬性會設定可以一次針對合併式發行集執行的並行合併程式數目限制。 如果同時排程的合併進程比允許執行的值還多,則多餘的作業會放入佇列中,並等到目前執行的合併進程完成為止。

[ @max_concurrent_dynamic_snapshots = ] max_concurrent_dynamic_snapshots

可以同時執行的 快照集代理程式 會話數目上限,以產生訂閱者數據分割的篩選數據快照集。 @max_concurrent_dynamic_snapshots為 int,預設值為 0。 如果 0為 ,則數目快照集會話沒有限制。 如果同時排程的快照集進程比允許執行的值還多,則多餘的作業會放入佇列中,並等到目前執行的快照集進程完成為止。

[ @use_partition_groups = ] N'use_partition_groups'

指定應該使用預先計算的數據分割來優化同步處理程式。 @use_partition_groups為 nvarchar(5),可以是下列其中一個值:

Description
true 發行集使用預先計算的數據分割。
false 發行集不使用預先計算的數據分割。
NULL (預設值) 系統會決定數據分割策略。

預設會使用預先計算的數據分割。 若要避免使用預先計算的數據分割, @use_partition_groups 必須設定為 false。 當 為 時 NULL,系統會決定是否可以使用預先計算的數據分割。 如果無法使用預先計算的數據分割,則此值實際上會變成 false ,而不會產生任何錯誤。 在這種情況下, @keep_partition_changes 可以設定為 true 以提供一些優化。 如需詳細資訊,請參閱 參數化篩選 - 參數化數據列篩選參數化篩選 - 針對預先計算的數據分割優化。

[ @publication_compatibility_level = ] N'publication_compatibility_level'

表示發行集的回溯相容性。 @publication_compatibility_level為 nvarchar(6),可以是下列其中一個值:

版本
90RTM SQL Server 2005 (9.x)
100RTM SQL Server 2008 (10.0.x)

[ @replicate_ddl = ] replicate_ddl

指出發行集是否支援架構複寫。 @replicate_ddl為 int,預設值為 NULL1 表示在發行者端執行的數據定義語言 (DDL) 語句會復寫,並 0 指出不會復寫 DDL 語句。 如需詳細資訊,請參閱對發行集資料庫進行結構描述變更

DDL 語句加入數據行時,會接受@replicate_ddl 參數。 當 DDL 語句改變或卸除數據行時,會忽略@replicate_ddl參數,原因如下。

  • 卸除數據行時, sysarticlecolumns 必須更新 ,以防止新的 DML 語句包含會導致散發代理程式失敗的已卸除數據行。 因為復寫必須一律復寫架構變更,因此會忽略@replicate_ddl參數。

  • 更改數據行時,源數據類型或 Null 屬性可能會變更,導致 DML 語句包含可能與訂閱者端數據表不相容的值。 這類 DML 語句可能會導致散發代理程序失敗。 因為復寫必須一律復寫架構變更,因此會忽略@replicate_ddl參數。

  • 當 DDL 語句加入新的資料行時, sysarticlecolumns 不包含新的數據行。 DML 語句不會嘗試複寫新數據行的數據。 因為可接受複寫或不復寫 DDL,因此會接受 參數。

[ @allow_subscriber_initiated_snapshot = ] N'allow_subscriber_initiated_snapshot'

指出這個發行集的訂閱者是否可以起始快照集程式,以為其數據分割產生篩選的快照集。 @allow_subscriber_initiated_snapshot為 nvarchar(5),預設值為 falsetrue 表示訂閱者可以起始快照集進程。

[ @allow_web_synchronization = ] N'allow_web_synchronization'

指定是否為 Web 同步處理啟用發行集。 @allow_web_synchronization為 nvarchar(5),預設值為 falsetrue 指定可透過 HTTPS 同步處理此發行集的訂閱。 如需詳細資訊,請參閱< Web Synchronization for Merge Replication>。 若要支援 SQL Server Compact 訂閱者,您必須指定 true

[ @web_synchronization_url = ] N'web_synchronization_url'

指定用於 Web 同步處理的因特網 URL 預設值。 @web_synchronization_url為 nvarchar(500),預設值為 NULL。 如果在執行sp_addmergepullsubscription_agent未明確設定,則定義預設因特網 URL。

[ @allow_partition_realignment = ] N'allow_partition_realignment'

判斷在發行者上修改數據列時,是否會將刪除傳送給訂閱者,而導致它變更其分割區。 @allow_partition_realignment為 nvarchar(5),預設值為 true

  • true 傳送刪除至訂閱者,以反映數據分割變更的結果,方法是移除不再屬於訂閱者分割區一部分的數據。

  • false 會離開訂閱者上舊分割區的數據,其中對發行者上的此數據所做的變更不會復寫到此訂閱者,但訂閱者上所做的變更會復寫至發行者。

將 @allow_partition_realignmentfalse 設定為 ,以在數據需要供歷史用途存取時,用來從舊分割區保留訂用帳戶中的數據。

注意

由於將@allow_partition_realignmentfalse設定為 ,保留在訂閱者端的數據應該視為唯讀;不過,複寫系統不會強制執行此設定。

[ @retention_period_unit = ] N'retention_period_unit'

指定@retention設定的保留期間單位。 @retention_period_unit為 nvarchar(10),而且可以是下列其中一個值。

版本
day (預設值) 保留期間是以天為單位指定。
week 保留期間是以周為單位指定。
month 保留期間是以月為單位指定。
year 保留期間是以年份指定。

[ @generation_leveling_threshold = ] generation_leveling_threshold

指定世代中包含的變更數目。 世代是傳遞至發行者或訂閱者之變更的集合。 @generation_leveling_threshold 為 int ,預設值為 1000

[ @automatic_reinitialization_policy = ] automatic_reinitialization_policy

指定在變更發行集所需的自動重新初始化之前,是否要從訂閱者上傳變更,其中已針對 @force_reinit_subscription 指定 的值 1@automatic_reinitialization_policy為 bit ,預設值為 0

1 表示在自動重新初始化之前,會先從訂閱者上傳變更。

重要

如果您新增、卸載或變更參數化篩選,則訂閱者端的擱置變更無法在重新初始化期間上傳至發行者。 如果您要上傳暫止變更,請在變更篩選之前,同步處理所有訂閱。

[ @conflict_logging = ] N'conflict_logging '

指定儲存衝突記錄的位置。 @conflict_logging Nvarchar(15), 而且可以是下列其中一個值:

Description
publisher 衝突記錄會儲存在發行者端。
subscriber 衝突記錄會儲存在造成衝突的訂閱者端。 SQL Server Compact 訂閱者不支援。
both 衝突記錄會同時儲存在發行者和訂閱者端。
NULL (預設值) 當值@publication_compatibility_level為 和 所有其他情況下, 複寫會自動將 @conflict_logging both 設定 為 。 publisher90RTM

傳回碼值

0 (成功)或 1 (失敗)。

備註

sp_addmergepublication 用於合併式複寫。

若要使用 @add_to_active_directory 參數將發行集物件列出至 Active Directory,必須在 Active Directory 中建立 SQL Server 物件。

如果有多個發行集發行相同的資料庫物件,則只有具有複寫 、 ALTER VIEW 、、 ALTER PROCEDUREALTER FUNCTIONALTER TRIGGER DDL 語句之@replicate_ddl 值的 1ALTER TABLE 發行集 。 不過, ALTER TABLE DROP COLUMN 所有發行卸載資料行的發行集都會複寫 DDL 語句。

針對 SQL Server Compact Subscribers,只有在 @snapshot_in_default_folder 的值 false 時,才會使用 @alternate_snapshot_folder 的值

針對發行集啟用 DDL 複寫時, @replicate_ddl = 1 若要對發行集進行非複寫的 DDL 變更, 必須先執行 sp_changemergepublication (Transact-SQL) 以將 @replicate_ddl 設定 0 。 發出非複寫 DDL 語句之後, sp_changemergepublication 可以再次執行以重新開啟 DDL 複寫。

範例

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Declarations for adding a merge publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database, using defaults.
USE master
EXEC sp_replicationdboption 
  @dbname=@publicationDB, 
  @optname=N'merge publish',
  @value = N'true' 

-- Create a new merge publication, explicitly setting the defaults. 
USE [AdventureWorks2022]
EXEC sp_addmergepublication 
-- These parameters are optional.
  @publication = @publication,
  -- optional parameters 
  @description = N'Merge publication of AdventureWorks2022.',
  @publication_compatibility_level  = N'120RTM';

-- Create a new snapshot job for the publication.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = @login, 
  @job_password = @password;
GO

權限

只有系統管理員 固定伺服器角色或 db_owner 固定資料庫角色的成員 才能執行 sp_addmergepublication