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 小时的宽限期,以适应处于不同时区中的订阅服务器。例如,如果将保持期设置为 1 天,则实际的保持期为 48 小时。

  • [ @sync_mode = ] 'sync_mode'
    是订阅服务器对发布进行初始同步时采用的模式。 sync_mode 的数据类型为 nvarchar(10),它可以为以下值之一。

    说明

    native(默认值)

    生成所有表的本机模式大容量复制程序输出。

    character

    生成所有表的字符模式大容量复制程序输出。 必须有它才能支持 Microsoft SQL Server Compact 和非 SQL Server 订阅服务器。

  • [ @allow_push = ] 'allow_push'
    指定是否可为给定发布创建推入订阅。 allow_push 的数据类型为 nvarchar(5),默认值为 TRUE,表示允许为此发布创建推入订阅。

  • [ @allow_pull = ] 'allow_pull'
    指定是否可为给定发布创建拉出订阅。 allow_pull 的数据类型为 nvarchar(5),其默认值为 TRUE,表示允许为此发布创建请求订阅。 必须将其值指定为 True 才可支持 SQL Server Compact 订阅服务器。

  • [ @allow_anonymous = ] 'allow_anonymous'
    指定是否可为给定发布创建匿名订阅。 allow_anonymous 的数据类型为 nvarchar(5),其默认值为 TRUE,表示允许为此发布创建匿名订阅。 若要支持 SQL Server Compact 订阅服务器,必须指定为 true。

  • [ @enabled_for_internet = ] 'enabled_for_internet'
    指定是否为 Internet 启用此发布,并确定是否可以使用文件传输协议 (FTP) 将快照文件传输到订阅服务器。 enabled_for_internet 的数据类型为 nvarchar(5),默认值为 FALSE。 如果为 true,则此发布的同步文件将放到 C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL.x\Repldata\Ftp 目录下。 用户必须创建 FTP 目录。 如果为 false,则不为 Internet 访问启用此发布。

  • [ @centralized_conflicts =] 'centralized_conflicts'
    已不推荐使用该参数,支持该参数只是为了让脚本能够向后兼容。 使用 conflict_logging 来指定存储冲突记录的位置。

  • [ @dynamic_filters =] 'dynamic_filters'
    允许合并发布使用参数化行筛选器。 dynamic_filters 的数据类型为 nvarchar(5),默认值为 FALSE。

    备注

    如果正在使用参数化行筛选器,请勿指定此参数,而应由 SQL Server 自行确定。如果指定 dynamic_filters 的值为 true,则必须为此项目定义参数化行筛选器。有关详细信息,请参阅定义和修改合并项目的参数化行筛选器

  • [ @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。 在订阅服务器上应用快照时,合并代理将在运行任何复制的对象脚本之前运行快照前脚本。 该脚本将在合并代理连接到订阅数据库时使用的安全上下文中执行。 快照前脚本不在 SQL Server Compact 订阅服务器上运行。

  • [ @post_snapshot_script = ] 'post_snapshot_script'
    指定指向 .sql 文件位置的指针。 post_snapshot_script 的数据类型为 nvarchar(255),默认值为 NULL。 当所有其他复制的对象脚本和数据均已在初始同步过程中应用之后,合并代理将运行快照后脚本。 该脚本将在合并代理连接到订阅数据库时使用的安全上下文中执行。 快照后脚本不在 SQL Server Compact 订阅服务器上运行。

  • [ @compress_snapshot = ] 'compress_snapshot'
    指定写入 @alt_snapshot_folder 位置的快照将压缩成 Microsoft CAB 格式。 compress_snapshot 的数据类型为 nvarchar(5),默认值为 FALSE。 值为 false 时指定快照将不进行压缩;值为 true 时指定快照将进行压缩。 无法压缩大于 2GB 的快照文件。 压缩的快照文件被解压缩到合并代理所在的位置;一般对压缩的快照使用请求订阅,以便在订阅服务器上解压缩文件。 不能压缩默认文件夹中的快照。 若要支持 SQL Server Compact 订阅服务器,必须指定为 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 订阅服务器时,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),它可以为以下值之一:

    版本

    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 订阅服务器,必须指定为 true。

  • [ @web_synchronization_url= ] 'web_synchronization_url'
    指定用于 Web 同步的 Internet URL 的默认值。 web_synchronization_url i 的数据类型为 nvarchar(500),默认值为 NULL。 在执行 sp_addmergepullsubscription_agent 且未明确设置该参数时,定义默认的 Internet 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 是一个位,默认值为 0。 1 表示在自动执行重新初始化之前,从订阅服务器上载更改。

    重要说明重要提示

    如果添加、删除或更改参数化筛选器,重新初始化期间在订阅服务器上挂起的更改将无法上载到发布服务器。若要上载挂起的更改,请在更改筛选器前同步所有订阅。

  • [ @conflict_logging = ] 'conflict_logging'
    指定存储冲突记录的位置。 conflict_logging 的数据类型为 nvarchar(15),可以为以下值之一:

    说明

    publisher

    在发布服务器上存储冲突记录。

    subscriber

    在导致冲突的订阅服务器上存储冲突记录。 SQL Server Compact 订阅服务器不支持此值。

    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 订阅服务器,仅在 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'AdventureWorks2012'; 
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 [AdventureWorks2012]
EXEC sp_addmergepublication 
-- These parameters are optional.
  @publication = @publication,
  -- optional parameters 
  @description = N'Merge publication of AdventureWorks2012.',
  @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

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergepublication

请参阅

参考

sp_changemergepublication (Transact-SQL)

sp_dropmergepublication (Transact-SQL)

sp_helpmergepublication (Transact-SQL)

复制存储过程 (Transact-SQL)

概念

创建发布

发布数据和数据库对象