sp_addmergepublication (Transact-SQL)

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

主題連結圖示Transact-SQL 語法慣例

語法

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

引數

  • [ @publication = ] 'publication'
    這是要建立之合併式發行集的名稱。publication 是 sysname,沒有預設值,而且不能是關鍵字 ALL。在資料庫內,發行集名稱必須是唯一的。

  • [ @description = ] 'description'
    這是發行集的描述。description 是 nvarchar(255),預設值為 NULL。

  • [ @retention = ] retention
    這是用來儲存給定 publication 之變更的保留期限 (以保留期限單位來表示)。retention 是 int,預設值是 14 個單位。保留週期單位由 retention_period_unit 定義。如果未在保留期限內同步處理訂閱,且散發者端的清除作業移除了它已收到的暫止變更,訂閱便會到期,必須重新初始化。最大的允許保留期限是目前的日期到 9999 年 12 月 31 日之間的天數。

    [!附註]

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

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

    說明

    native (預設值)

    產生所有資料表的原生模式大量複製程式輸出。

    character

    產生所有資料表的字元模式大量複製程式輸出。支援 Microsoft SQL Server Compact 3.5 SP2 和非 SQL Server 訂閱者需要這個值。

  • [ @allow_push = ] 'allow_push'
    指定是否能夠針對指定的發行集建立發送訂閱。allow_push 是 nvarchar(5),預設值為 TRUE,允許發行集的發送訂閱。

  • [ @allow_pull = ] 'allow_pull'
    指定是否能夠針對指定的發行集建立提取訂閱。allow_pull 是 nvarchar(5),預設值為 TRUE,允許發行集的提取訂閱。您必須指定 true 來支援 SQL Server Compact 3.5 SP2 訂閱者。

  • [ @allow_anonymous = ] 'allow_anonymous'
    指定是否能夠針對指定的發行集建立匿名訂閱。allow_anonymous 是 nvarchar(5),預設值為 TRUE,允許發行集的匿名訂閱。若要支援 SQL Server Compact 3.5 SP2 訂閱者,您必須指定 true。

  • [ @enabled_for_internet = ] '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 =] 'centralized_conflicts'
    這個參數已被取代,支援它的目的,只是為了與舊版的指令碼相容。請利用 conflict_logging 來指定衝突記錄的儲存位置。

  • [ @dynamic_filters =] 'dynamic_filters'
    使合併式發行集能夠使用參數化資料列篩選器。dynamic_filters 是 nvarchar(5),預設值為 FALSE。

    [!附註]

    您不應該指定這個參數,而應允許 SQL Server 自動判斷是否正在使用參數化資料列篩選器。如果您指定了 dynamic_filters 的 true 值,則必須定義發行項的參數化資料列篩選器。如需詳細資訊,請參閱<如何:定義和修改合併發行項的參數化資料列篩選器 (複寫 Transact-SQL 程式設計)>。

  • [ @snapshot_in_defaultfolder = ] 'snapshot_in_default_folder'
    指定是否將快照集檔案儲存在預設資料夾中。snapshot_in_default_folder 是 nvarchar(5),預設值為 TRUE。如果是 true,便可以在預設資料夾中找到快照集檔案。如果是 false,快照集檔案就會儲存在 alternate_snapshot_folder 所指定的替代位置中。替代位置可以在另一部伺服器、網路磁碟機或抽取式媒體 (如 CD-ROM 或抽取式磁碟) 中。另外,您也可以將快照集檔案儲存在檔案傳輸通訊協定 (FTP) 網站中,供訂閱者以後擷取它們。請注意,這個參數可以是 true,且仍有 alt_snapshot_folder 所指定的位置。這個組合會指定將快照集檔案同時儲存在預設位置和替代位置中。

  • [ @alt_snapshot_folder = ] 'alternate_snapshot_folder'
    指定快照集替代資料夾的位置。alternate_snapshot_folder 是 nvarchar(255),預設值為 NULL。

  • [ @pre_snapshot_script = ] 'pre_snapshot_script'
    指定指向 .sql 檔案位置的指標。pre_snapshot_script 是 nvarchar(255),預設值為 NULL。在訂閱者端套用快照集時,合併代理程式會在任何複寫的物件指令碼之前,先執行前快照集 (Pre-snapshot) 指令碼。這個指令碼是在連接到訂閱資料庫時,在合併代理程式所用的安全性內容中執行。前快照集 (Pre-snapshot) 指令碼並非執行於 SQL Server Compact 3.5 SP2 訂閱者。

  • [ @post_snapshot_script = ] 'post_snapshot_script'
    指定指向 .sql 檔案位置的指標。post_snapshot_script 是 nvarchar(255),預設值為 NULL。在初始同步處理期間,合併代理程式會先套用所有其他複寫的物件指令碼和資料,然後才執行後快照集 (Post-snapshot) 指令碼。這個指令碼是在連接到訂閱資料庫時,在合併代理程式所用的安全性內容中執行。後快照集 (Post-snapshot) 指令碼並非執行於 SQL Server Compact 3.5 SP2 訂閱者。

  • [ @compress_snapshot = ] 'compress_snapshot'
    指定將寫入 @alt_snapshot_folder 位置的快照集壓縮成 Microsoft CAB 格式。compress_snapshot 是 nvarchar(5),預設值為 FALSE。false 指定不壓縮快照集,而 true 則指定壓縮快照集。超出 2GB 的快照集檔案無法壓縮。壓縮的快照集檔案是在執行合併代理程式的位置進行解壓縮;提取訂閱通常會搭配使用壓縮的快照集,因此,會在訂閱者端將檔案解壓縮。預設資料夾中的快照集無法壓縮。若要支援 SQL Server Compact 3.5 SP2 訂閱者,您必須指定 false。

  • [ @ftp_address = ] 'ftp_address'
    這是散發者之 FTP 服務的網路位址。ftp_address 是 sysname,預設值為 NULL。指定發行集快照集檔案所在的位置,以便訂閱者的合併代理程式能夠加以收取。由於每個發行集都會儲存這個屬性,因此,每個發行集都可以有不同的 ftp_address。發行集必須支援利用 FTP 來傳播快照集。

  • [ @ftp_port= ] ftp_port
    這是散發者的 FTP 服務通訊埠編號。ftp_port 是 int,預設值為 21。指定發行集快照集檔案所在的位置,以便訂閱者的合併代理程式能夠加以收取。由於每個發行集都會儲存這個屬性,因此,每個發行集都可以有它自己的 ftp_port。

  • [ @ftp_subdirectory = ] 'ftp_subdirectory'
    指定如果發行集支援利用 FTP 來傳播快照集,訂閱者的合併代理程式可收取快照集檔案的位置。ftp_subdirectory 是 nvarchar(255),預設值為 NULL。由於每個發行集都會儲存這個屬性,因此,每個發行集都可以有它自己的 ftp_subdirctory,也可以選擇用 NULL 來表示沒有任何子目錄。

    當利用參數化篩選來預先產生快照集時,每個訂閱者資料分割的資料快照集都必須在它自己的資料夾中。利用 FTP 預先產生快照集,其目錄結構必須遵照下列結構:

    alternate_snapshot_folder\ftp\publisher_publicationDB_publication\partitionID.

    [!附註]

    上述斜體值會隨著發行集和訂閱者資料分割的細節而不同。

  • [ @ftp_login = ] 'ftp_login'
    這是用來連接到 FTP 服務的使用者名稱。ftp_login 是 sysname,預設值為 'anonymous'。

  • [ @ftp_password = ] 'ftp_password'
    這是用來連接到 FTP 服務的使用者密碼。ftp_password 是 sysname,預設值為 NULL。

    安全性注意事項安全性注意事項

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

  • [ @conflict_retention = ] conflict_retention
    指定保留衝突的保留週期 (以天為單位)。conflict_retention 是 int,預設值是在 14 天之後,便從衝突資料表中清除衝突資料列。

  • [ @keep_partition_changes = ] '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 值。如需有關此參數的詳細資訊,請參閱<複寫快照集代理程式>。如需有關如何指定代理程式參數的詳細資訊,請參閱<管理複寫代理程式>。

    使用 SQL Server Compact 3.5 SP2 訂閱者時,keep_partition_changes 必須設為 true,以確保正確傳播刪除項目。設為 false 時,訂閱者包含的資料列可能比預期多。

  • [ @allow_subscription_copy= ] 'allow_subscription_copy'
    啟用或停用複製訂閱這個發行集之訂閱資料庫的能力。allow_subscription_copy 是 nvarchar(5),預設值為 FALSE。所複製的訂閱資料庫大小必須小於 2 GB。

  • [ @allow_synctoalternate = ] 'allow_synctoalternate'
    僅供參考之用。不支援。我們無法保證未來的相容性。

  • [ @validate_subscriber_info = ] 'validate_subscriber_info'
    列出使用參數化資料列篩選器時,用來定義發行資料之訂閱者資料分割的函數。validate_subscriber_info 是 nvarchar(500),預設值為 NULL。合併代理程式利用這項資訊來驗證訂閱者的資料分割。例如,如果在參數化資料列篩選器中使用 SUSER_SNAME,參數應該是 @validate_subscriber_info=N'SUSER_SNAME()'。

    [!附註]

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

  • [ @add_to_active_directory = ] 'add_to_active_directory'
    這個參數已被取代,支援它的目的,只是為了與舊版的指令碼相容。您不能再將發行集資訊加入 Microsoft Active Directory 中。

  • [ @max_concurrent_merge = ] maximum_concurrent_merge
    並行合併處理序的最大數目。maximum_concurrent_merge 是 int,預設值為 0。這個屬性的 0 值表示在任何給定時間執行的並行合併處理序數目都沒有限制。這個屬性會設定能夠針對合併式發行集來同時執行的並行合併處理序的數目限制。如果排程同時執行的合併處理序數目超出允許執行的值,超出的作業便會放在佇列中,等到目前在執行中的合併處理序完成為止。

  • [ @max_concurrent_dynamic_snapshots =] max_concurrent_dynamic_snapshots
    可同時執行以便產生訂閱者資料分割之篩選資料快照集的最大快照集代理程式工作階段數目。maximum_concurrent_dynamic_snapshots 是 int,預設值為 0。如果是 0,快照集工作階段的數目就沒有任何限制。如果排程同時執行的快照集處理序數目超出允許執行的值,超出的作業便會放在佇列中,等到目前在執行中的快照集處理序完成為止。

  • [ @use_partition_groups = ] 'use_partition_groups'
    指定應該利用預先計算的資料分割來最佳化同步處理。use_partition_groups 是 nvarchar(5),而且可以是下列其中一個值:

    說明

    true

    發行集使用預先計算的資料分割。

    false

    發行集不使用預先計算的資料分割。

    NULL (預設值)

    系統決定資料分割策略。

    依預設,會使用預先計算的資料分割。若要避免使用預先計算的資料分割,use_partition_groups 必須設定為 false。當設為 NULL 時,系統會決定能不能使用預先計算的資料分割。如果無法使用預先計算的資料分割,這個值會實際改成 false,不會產生任何錯誤。在這種情況下,您可以將 keep_partition_changes 設定為 true 來提供部分最佳化。如需詳細資訊,請參閱<參數化資料列篩選器>和<使用預先計算的資料分割最佳化參數化篩選效能>。

  • [ @publication_compatibility_level = ] backward_comp_level
    指出發行集的回溯相容性。backward_comp_level 是 nvarchar(6),而且可以是下列其中一個值:

    版本

    70RTM

    SQL Server 7.0

    70SP1

    SQL Server 7.0 Service Pack 1

    70SP2

    SQL Server 7.0 Service Pack 2

    70SP3

    SQL Server 7.0 Service Pack 3

    70SP4

    SQL Server 7.0 Service Pack 4

    80RTM

    SQL Server 2000

    80SP1

    SQL Server 2000 Service Pack 1

    80SP2

    SQL Server 2000 Service Pack 2

    80SP3

    SQL Server 2000 Service Pack 3

    90RTM

    SQL Server 2005

    100RTM

    SQL Server 2008

  • [ @replicate_ddl = ] replicate_ddl
    指出結構描述複寫是否支援發行集。replicate_ddl 是 int,預設值為 1。1 表示複寫在發行者端執行的資料定義語言 (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 = ] 'allow_subscriber_initiated_snapshot'
    指出這個發行集的訂閱者是否能起始快照集處理序來產生資料分割的篩選快照集。allow_subscriber_initiated_snapshot 是 nvarchar(5),預設值為 FALSE。true 表示訂閱者可以起始快照集處理序。

  • [ @allow_web_synchronization = ] 'allow_web_synchronization'
    指定是否啟用發行集的 Web 同步處理。allow_web_synchronization 是 nvarchar(5),預設值為 FALSE。true 指定可以透過 HTTPS 來同步處理這個發行集的訂閱。如需詳細資訊,請參閱<合併式複寫的 Web 同步處理>。若要支援 SQL Server Compact 3.5 SP2 訂閱者,您必須指定 true。

  • [ @web_synchronization_url= ] 'web_synchronization_url'
    指定 Web 同步處理所用的網際網路 URL 預設值。web_synchronization_url i 是 nvarchar(500),預設值為 NULL。定義當執行 sp_addmergepullsubscription_agent 並未明確設定網際網路 URL 時,所用的預設網際網路 URL。

  • [ @allow_partition_realignment = ] 'allow_partition_realignment'
    決定當修改發行者的資料列造成資料分割的變更時,是否要將刪除動作傳給訂閱者。allow_partition_realignment 是 nvarchar(5),預設值為 TRUE。true 會將刪除動作傳給訂閱者來移除已不在訂閱者資料分割中的資料,以反映資料分割變更的結果。false 會將舊資料分割的資料保留在訂閱者中,發行者這項資料的變更並不會複寫到這個訂閱者,但訂閱者的變更會複寫到發行者中。當因為記錄而需要存取舊資料分割中的訂閱資料時,便利用將 allow_partition_realignment 設定為 false 的方式來保留這份資料。

    [!附註]

    因為 allow_partition_realignment 設為 false 而保留在訂閱者端的資料,應該依照唯讀的方式來處理。不過,複寫系統並不會強制執行這一點。

  • [ @retention_period_unit = ] '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 = ] 'conflict_logging'
    指定衝突記錄的儲存位置。conflict_logging 是 nvarchar(15),而且可以是下列其中一個值:

    說明

    publisher

    衝突記錄會儲存在發行者端。

    subscriber

    衝突記錄會儲存在造成衝突的訂閱者端。不支援 SQL Server Compact 3.5 SP2 訂閱者。

    both

    衝突記錄會儲存在發行者端和訂閱者端。

    NULL (預設值)

    當 backward_comp_level 值是 90RTM 時,複寫會自動將 conflict_logging 設為 both,否則,便會設為 publisher

傳回碼值

0 (成功) 或 1 (失敗)

備註

sp_addmergepublication 用於合併式複寫中。

若要利用 @add_to_active_directory 參數來列出 Active Directory 中的發行集物件,您必須已在 Active Directory 中建立 SQL Server 物件。

如果有多個發行相同資料庫物件的發行集存在,只有 replicate_ddl 值是 1 的發行集會複寫 ALTER TABLE、ALTER VIEW、ALTER PROCEDURE、ALTER FUNCTION 和 ALTER TRIGGER DDL 陳述式。不過,所有發行已卸除之資料行的發行集都會複寫 ALTER TABLE DROP COLUMN DDL 陳述式。

若為 SQL Server Compact 3.5 SP2 訂閱者,只有當 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'AdventureWorks2008R2'; 
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 [AdventureWorks2008R2]
EXEC sp_addmergepublication 
-- These parameters are optional.
  @publication = @publication,
  -- optional parameters 
  @description = N'Merge publication of AdventureWorks2008R2.',
  @publication_compatibility_level  = N'90RTM';

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

權限

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