sp_addpublication (Transact-SQL)
创建快照或事务发布。此存储过程在发布服务器上对发布数据库执行。
语法
sp_addpublication [ @publication = ] 'publication'
[ , [ @taskid = ] tasked ]
[ , [ @restricted = ] 'restricted' ]
[ , [ @sync_method = ] 'sync_method' ]
[ , [ @repl_freq = ] 'repl_freq' ]
[ , [ @description = ] 'description' ]
[ , [ @status = ] 'status' ]
[ , [ @independent_agent = ] 'independent_agent' ]
[ , [ @immediate_sync = ] 'immediate_sync' ]
[ , [ @enabled_for_internet = ] 'enabled_for_internet' ]
[ , [ @allow_push = ] 'allow_push'
[ , [ @allow_pull = ] 'allow_pull' ]
[ , [ @allow_anonymous = ] 'allow_anonymous' ]
[ , [ @allow_sync_tran = ] 'allow_sync_tran' ]
[ , [ @autogen_sync_procs = ] 'autogen_sync_procs' ]
[ , [ @retention = ] retention ]
[ , [ @allow_queued_tran= ] 'allow_queued_updating' ]
[ , [ @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' ]
[ , [ @allow_dts = ] 'allow_dts' ]
[ , [ @allow_subscription_copy = ] 'allow_subscription_copy' ]
[ , [ @conflict_policy = ] 'conflict_policy' ]
[ , [ @centralized_conflicts = ] 'centralized_conflicts' ]
[ , [ @conflict_retention = ] conflict_retention ]
[ , [ @queue_type = ] 'queue_type' ]
[ , [ @add_to_active_directory = ] 'add_to_active_directory' ]
[ , [ @logreader_job_name = ] 'logreader_agent_name' ]
[ , [ @qreader_job_name = ] 'queue_reader_agent_name' ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @allow_initialize_from_backup = ] 'allow_initialize_from_backup' ]
[ , [ @replicate_ddl = ] replicate_ddl ]
[ , [ @enabled_for_p2p = ] 'enabled_for_p2p' ]
[ , [ @publish_local_changes_only = ] 'publish_local_changes_only' ]
[ , [ @enabled_for_het_sub = ] 'enabled_for_het_sub' ]
[ , [ @p2p_conflictdetection = ] 'p2p_conflictdetection' ]
[ , [ @p2p_originator_id = ] p2p_originator_id
[ , [ @p2p_continue_onconflict = ] 'p2p_continue_onconflict'
[ , [ @allow_partition_switch = ] 'allow_partition_switch'
[ , [ @replicate_partition_switch = ]'replicate_partition_switch'
参数
[ @publication=] 'publication'
要创建的发布的名称。publication 的数据类型为 sysname,无默认值。该名称在数据库中必须唯一。[ @taskid=] taskid
仅为保持向后兼容性而支持;使用sp_addpublication_snapshot (Transact-SQL)。[ @restricted=] 'restricted'
仅为保持向后兼容性而支持;使用 default_access。[ @sync_method=] 'sync_method**'**
同步模式。sync_method 的数据类型为 nvarchar(13),可以为以下值之一。值
说明
native
生成所有表的本机模式大容量复制程序输出。Oracle 发布服务器不支持。
character
生成所有表的字符模式大容量复制程序输出。对于 Oracle 发布服务器,character 仅对快照复制有效。
concurrent
生成所有表的本机模式大容量复制程序输出,但在快照过程中并不锁定表。只有事务发布支持该值。Oracle 发布服务器不支持。
concurrent_c
生成所有表的字符模式大容量复制程序输出,但在快照过程中并不锁定表。只有事务发布支持该值。
database snapshot
从数据库快照生成所有表的本机模式大容量复制程序输出。此选项需要 SQL Server Enterprise。
database snapshot character
从数据库快照生成所有表的字符模式大容量复制程序输出。此选项需要 SQL Server Enterprise。
NULL(默认值)
对于 MicrosoftSQL Server 发布服务器,默认值为 native。对于非 SQL Server 发布服务器,当 repl_freq 的值为 Snapshot 时,默认值为 character,在其他所有情况下,都默认为 concurrent_c。
[ @repl_freq=] 'repl_freq'
复制频率的类型,repl_freq 的数据类型为 nvarchar(10),可以为以下值之一。值
说明
continuous(默认值)
发布服务器提供所有基于日志的事务的输出。对于非 SQL Server 发布服务器,要求将 sync_method 设置为 concurrent_c。
snapshot
发布服务器仅生成计划的同步事件。对于非 SQL Server 发布服务器,要求将 sync_method 设置为 character。
[ @description=] 'description'
发布的可选说明。description 的数据类型为 nvarchar(255),默认值为 NULL。[ @status=] 'status'
指定发布数据是否可用。status 的数据类型为 nvarchar(8),可以为以下值之一。值
说明
active
发布数据可立即用于订阅服务器。
inactive(默认值)
首次创建发布时,发布数据不能由订阅服务器使用(订阅服务器可以订阅,但这些订阅不被处理)。
Oracle 发布服务器不支持。
[ @independent_agent=] 'independent_agent'
指定该发布是否有独立分发代理。independent_agent 的数据类型为 nvarchar(5),默认值为 FALSE。如果为 True,则表示该发布有独立分发代理。如果为 False,则发布使用共享分发代理,且每对发布服务器数据库/订阅服务器数据库共享一个代理。[ @immediate_sync=] 'immediate_synchronization'
指定每次运行快照代理时是否为发布创建同步文件。immediate_synchronization 的数据类型为 nvarchar(5),默认值为 FALSE。如果为 True,表示每次运行快照代理时都创建或重新创建同步文件。如果快照代理在订阅创建前完成,则订阅服务器可以立即获得同步文件。新订阅获得最近一次执行快照代理生成的最新同步文件。independent_agent 必须为 True,才能使 immediate_synchronization 为 True。如果为 False,则仅当有新订阅时,才创建同步文件。当以增量方式向现有发布添加新项目时,必须为每个订阅调用 sp_addsubscription。订阅后订阅服务器无法接收同步文件,直到启动并完成快照代理为止。[ @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 目录。[ @allow_push=] 'allow_push'
指定是否可以为给定发布创建推送订阅。allow_push 的数据类型为 nvarchar(5),其默认值为 TRUE,表示允许为此发布创建推送订阅。[ @allow_pull=] 'allow_pull'
指定是否可为给定发布创建请求订阅。allow_pull 的数据类型为 nvarchar(5),默认值为 FALSE。如果为 False,则表示不允许对该发布创建请求订阅。[ @allow_anonymous=] 'allow_anonymous'
指定是否可为给定发布创建匿名订阅。allow_anonymous 的数据类型为 nvarchar(5),默认值为 FALSE。如果为 True,则 immediate_synchronization 也必须设置为 True。如果为 False,则表示不允许对该发布创建匿名订阅。[ @allow_sync_tran=] 'allow_sync_tran'
指定是否允许对发布使用立即更新订阅。allow_sync_tran 的数据类型为 nvarchar(5),默认值为 FALSE。Oracle 发布服务器不支持 True。[ @autogen_sync_procs=] 'autogen_sync_procs'
指定是否在发布服务器上生成更新订阅的同步存储过程。autogen_sync_procs 的数据类型为 nvarchar(5),可以为以下值之一。值
说明
True
在启用更新订阅时自动设置。
False
在未启动更新订阅或没有为 Oracle 发布服务器启动更新订阅时自动设置。
NULL(默认值)
启动更新订阅时,默认值为 True,未启用更新订阅时,默认值为 False。
注意 根据为 allow_queued_tran 和 allow_sync_tran 指定的值,用户提供的 autogen_sync_procs值将被覆盖。
[ @retention=] retention
订阅活动的保持期(小时)。retention 的数据类型为 int,默认值为 336 小时。如果订阅在保持期内不活动,则过期后将其删除。该值可以大于发布服务器使用的分发数据库的最大保持期。如果为 0,则对发布的已知订阅将永不过期,并且永远不会被过期订阅清除代理删除。[ @allow_queued_tran= ] 'allow_queued_updating'
在订阅服务器中启用或禁用更改的队列,直到可在发布服务器上应用这些更改为止。allow_queued_updating 的数据类型为 nvarchar(5),默认值为 FALSE。如果为 False,则订阅服务器上的更改将不排队。Oracle 发布服务器不支持True。[ @snapshot_in_defaultfolder= ] 'snapshot_in_default_folder'
指定是否将快照文件存储在默认文件夹中。snapshot_in_default_folder 的数据类型为 nvarchar(5),默认值为 TRUE。如果为 True,则可以在默认文件夹中找到快照文件。如果为 False,则表示快照文件已存储在 alternate_snapshot_folder 所指定的备用位置。备用位置可以在另一台服务器、一个网络驱动器或可移动媒体(如光盘或可移动磁盘)上。也可以将快照文件保存到 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。在订阅服务器上应用快照时,分发代理将在运行任何复制的对象脚本之前运行快照前脚本。该脚本在分发代理连接到订阅数据库时使用的安全上下文中执行。[ @post_snapshot_script= ] 'post_snapshot_script'
指定指向 .sql 文件位置的指针。post_snapshot_script 的数据类型为 nvarchar(255),其默认值为 NULL。分发代理将在初始同步过程中已应用所有其他复制的对象脚本和数据之后才运行快照后脚本。该脚本在分发代理连接到订阅数据库时使用的安全上下文中执行。[ @compress_snapshot= ] 'compress_snapshot'
指定将写入 @alt_snapshot_folder 位置的快照压缩成 Microsoft CAB 格式。compress_snapshot 的数据类型为 nvarchar(5),默认值为 FALSE。False 指定不压缩快照,而 True 指定压缩快照。不能压缩大于 2 GB 的快照文件。压缩快照文件在分发代理运行的位置解压缩;请求订阅通常与压缩快照一起使用,以便在订阅服务器上解压缩文件。不能压缩默认文件夹中的快照。[ @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_login = ] 'ftp_login'
用于连接到 FTP 服务的用户名。ftp_login 的数据类型为 sysname,默认值为 ANONYMOUS。[ @ftp_password = ] 'ftp_password'
是用于连接到 FTP 服务的用户密码。ftp_password 的数据类型为 sysname,其默认值为 NULL。[ @allow_dts = ] 'allow_dts'
指定发布允许数据转换。创建订阅时可以指定 DTS 包。allow_transformable_subscriptions 的数据类型为 nvarchar(5),默认值为 FALSE,它不允许 DTS 转换。当 allow_dts 为 True 时,sync_method 必须设置为 character 或 concurrent_c。Oracle 发布服务器不支持True。
[ @allow_subscription_copy = ] 'allow_subscription_copy'
启用或禁用复制订阅此发布的订阅数据库的功能。allow_subscription_copy 的数据类型为 nvarchar(5),其默认值为 FALSE。[ @conflict_policy = ] 'conflict_policy'
指定当使用排队更新订阅服务器选项时所遵从的冲突解决策略。conflict_policy 的数据类型为 nvarchar(100),默认值为 NULL,可以为以下值之一。值
说明
pub wins
发布服务器在冲突中入选。
sub reinit
重新初始化订阅。
sub wins
订阅服务器在冲突中入选。
NULL(默认值)
如果是 NULL 且该发布是快照发布,则默认策略将变成 sub reinit。如果是 NULL 且发布不是快照发布,则默认策略将变成 pub wins。
Oracle 发布服务器不支持。
[ @centralized_conflicts = ] 'centralized_conflicts'
指定是否在发布服务器上存储冲突记录。centralized_conflicts 的数据类型为 nvarchar(5),默认值为 TRUE。如果为 True,则在发布服务器上存储冲突记录。如果为 False,则将冲突记录同时存储在引起冲突的发布服务器和订阅服务器中。Oracle 发布服务器不支持。[ @conflict_retention = ] conflict_retention
指定冲突保持期(天)。这是为对等事务复制和排队更新订阅保存冲突元数据的一段时间。conflict_retention 的数据类型为 int,默认值为 14。Oracle 发布服务器不支持。[ @queue_type = ] 'queue_type'
指定使用的队列类型。queue_type 的数据类型为 nvarchar(10),默认值为 NULL,可以为以下值之一。值
说明
sql
使用 SQL Server 存储事务。
NULL(默认值)
默认值为 sql,该值指定使用 SQL Server 存储事务。
注意 不再支持使用 Microsoft 消息队列。指定 msmq 值将引发一个警告,并且复制自动将该值设置为 sql。
Oracle 发布服务器不支持。
[ @add_to_active_directory = ] 'add_to_active_directory'
已不推荐使用该参数,支持该参数只是为了让脚本能够向后兼容。不能再向 Microsoft Active Directory 中添加发布信息。[ @logreader_job_name = ] 'logreader_agent_name'
现有代理作业的名称。logreader_agent_name 的数据类型为 sysname,默认值为 NULL。仅当日志读取器代理将使用现有作业而不是新建作业时,才指定该参数。[ @qreader_job_name = ] 'queue_reader_agent_name'
现有代理作业的名称。queue_reader_agent_name 的数据类型为 sysname,默认值为 NULL。仅当队列读取器代理将使用现有作业而不是新建作业时,才指定该参数。[ [ @publisher = ] 'publisher'
指定一个非 SQL Server 发布服务器。publisher 的数据类型为 sysname,默认值为 NULL。注意 向 SQL Server 发布服务器添加发布时,不应使用 publisher。
[ [ @allow_initialize_from_backup = ] 'allow_initialize_from_backup'
指示订阅服务器是否能从备份而不是初始快照中初始化对此发布的订阅。allow_initialize_from_backup 的数据类型为 nvarchar(5),可以为以下值之一:值
说明
True
启用从备份进行的初始化。
False
禁用从备份进行的初始化。
NULL(默认值)
对于对等复制拓扑中的发布,默认为 True;对于所有其他发布,默认为 False。
有关详细信息,请参阅初始化事务订阅(不使用快照)。
[ [ @replicate_ddl = ] replicate_ddl
指示该发布是否支持架构复制。replicate_ddl 的数据类型为 int,对于 SQL Server 发布服务器,默认值为 1,对于非 SQL Server 发布服务器,默认值为 0。1 表示已复制在发布服务器上执行的数据定义语言 (DDL) 语句,0 表示未复制 DDL 语句。*Oracle 发布服务器不支持架构复制。*有关详细信息,请参阅对发布数据库进行架构更改。[ [ @enabled_for_p2p = ] 'enabled_for_p2p'
允许将发布用于对等复制拓扑中。enabled_for_p2p 的数据类型为 nvarchar(5),默认值为 FALSE。True 指示该发布支持对等复制。将 enabled_for_p2p 设置为 true 时,以下限制适用:allow_anonymous 必须为 False。
allow_dts 必须为 False。
allow_initialize_from_backup 必须为 True。
allow_queued_tran 必须为 false。
allow_sync_tran 必须为 false。
conflict_policy 必须为 False。
independent_agent 必须为 True。
repl_freq 必须为 continuous。
replicate_ddl 必须为 1。
有关详细信息,请参阅对等事务复制。
[ [ @publish_local_changes_only = ] 'publish_local_changes_only'
标识为仅供参考。 不提供支持。 不保证以后的兼容性。[ [ @enabled_for_het_sub= ] 'enabled_for_het_sub'
使发布支持非 SQL Server 订阅服务器。enabled_for_het_sub 的数据类型为 nvarchar(5),默认值为 FALSE。值为 true 时表示发布支持非 SQL Server 订阅服务器。当 enabled_for_het_sub 为 true 时,以下限制适用:allow_initialize_from_backup 必须为 false。
allow_push 必须为 true。
allow_queued_tran 必须为 false。
allow_subscription_copy 必须为 false。
allow_sync_tran 必须为 false。
autogen_sync_procs 必须为 false。
conflict_policy 必须为 NULL。
enabled_for_internet 必须为 false。
enabled_for_p2p 必须为 false。
ftp_address 必须为 NULL。
ftp_subdirectory 必须为 NULL。
ftp_password 必须为 NULL。
pre_snapshot_script 必须为 NULL。
post_snapshot_script 必须为 NULL。
replicate_ddl 必须为 0。
qreader_job_name 必须为 NULL。
queue_type 必须为 NULL。
sync_method 不能为 native 或 concurrent。
有关详细信息,请参阅非 SQL Server 订阅服务器。
[ @p2p_conflictdetection= ] 'p2p_conflictdetection'
如果为对等复制启用发布,使分发代理能够检测冲突。p2p_conflictdetection 的数据类型为 nvarchar(5),默认值为 TRUE。有关详细信息,请参阅对等复制中的冲突检测。[ @p2p_originator_id= ] p2p_originator_id
指定对等拓扑中某个节点的 ID。p2p_originator_id 的数据类型为 int,默认值为 NULL。此 ID 用于在 p2p_conflictdetection 设置为 TRUE 的情况下进行冲突检测。指定一个从未在拓扑中用过的正的非零 ID。若要获得已经用过的 ID 的列表,请执行 sp_help_peerconflictdetection。[ @p2p_continue_onconflict= ] 'p2p_continue_onconflict'
确定在检测到冲突之后分发代理是否继续处理更改。p2p_continue_onconflict 的数据类型为 nvarchar(5),默认值为 FALSE。注意 建议您使用默认值 FALSE。如果此选项设置为 TRUE,则分发代理会尝试应用来自具有最高发起方 ID 的节点的冲突行来收敛拓扑中的数据。此方法不保证将会收敛。您应确保检测到冲突之后拓扑保持一致。有关详细信息,请参阅对等复制中的冲突检测中的“处理冲突”。
[ [ @allow_partition_switch= ] 'allow_partition_switch'
指定是否可以对已发布的数据库执行 ALTER TABLE…SWITCH 语句。allow_partition_switch 的数据类型为 nvarchar(5),默认值为 FALSE。有关详细信息,请参阅复制已分区表和索引。[ [ @replicate_partition_switch= ] 'replicate_partition_switch'
指定是否应将对已发布的数据库执行的 ALTER TABLE…SWITCH 语句复制到订阅服务器。replicate_partition_switch 的数据类型为 nvarchar(5),默认值为 FALSE。仅在 allow_partition_switch 设置为 TRUE 时,此选项才有效。
返回代码值
0(成功)或 1(失败)
注释
sp_addpublication 用于快照复制和事务复制。
如果存在发布同一数据库对象的多个发布,则只有 replicate_ddl 值为 1 的发布才会复制 ALTER TABLE、ALTER VIEW、ALTER PROCEDURE、ALTER FUNCTION 和 ALTER TRIGGER DDL 语句。但是,发布已删除列的所有发布都将复制 ALTER TABLE DROP COLUMN DDL 语句。
当为发布启用 DDL 复制时 (replicate_ddl = 1),为了对发布进行非复制性的 DDL 更改,必须首先执行 sp_changepublication 以将 replicate_ddl 设置为 0。在发出非复制 DDL 语句后,可以再次运行 sp_changepublication,以再次打开 DDL 复制。
示例
-- To avoid storing the login and password in the script file, the values
-- are passed into SQLCMD as scripting variables. 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".
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks';
SET @publication = N'AdvWorksProductTran';
-- Windows account used to run the Log Reader and Snapshot Agents.
SET @login = $(Login);
-- This should be passed at runtime.
SET @password = $(Password);
-- Enable transactional or snapshot replication on the publication database.
EXEC sp_replicationdboption
@dbname=@publicationDB,
@optname=N'publish',
@value = N'true';
-- Execute sp_addlogreader_agent to create the agent job.
EXEC sp_addlogreader_agent
@job_login = @login,
@job_password = @password,
-- Explicitly specify the use of Windows Integrated Authentication (default)
-- when connecting to the Publisher.
@publisher_security_mode = 1;
-- Create a new transactional publication with the required properties.
EXEC sp_addpublication
@publication = @publication,
@status = N'active',
@allow_push = N'true',
@allow_pull = N'true',
@independent_agent = N'true';
-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = @login,
@job_password = @password,
-- Explicitly specify the use of Windows Integrated Authentication (default)
-- when connecting to the Publisher.
@publisher_security_mode = 1;
GO
权限
只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员可以执行 sp_addpublication。