本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 为 SQL Server 2014 中的事务发布启用更新订阅。
注释
此功能将在Microsoft SQL Server 的未来版本中删除。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
在您开始之前
安全
如果可能,请提示用户在运行时输入安全凭据。 如果必须在脚本文件中存储凭据,则必须保护该文件以防止未经授权的访问。
使用 SQL Server Management Studio
在新建发布向导的 “发布类型” 页上启用事务发布的更新订阅。 有关使用此向导的详细信息,请参阅 “创建发布”。 创建发布后,无法开启更新订阅的功能。
若要使用更新订阅,还必须在“新建订阅向导”中配置选项。 有关详细信息,请参阅 创建事务性发布的可更新订阅。
允许更新订阅
在“新建发布向导”的发布类型页面上,选择具有可更新订阅的事务发布。
在 “代理安全性 ”页上,除了快照代理和日志读取器代理之外,还指定队列读取器代理的安全设置。 有关运行队列读取器代理的帐户所需的权限的详细信息,请参阅 复制代理安全模型。
注释
队列读取器代理即使在仅使用即时更新订阅的情况下也会被配置。
使用 Transact-SQL
使用复制存储过程以编程方式创建事务发布时,可以启用即时或排队更新订阅。
创建一个可以立即更新订阅的发布物
如有必要,请为发布数据库创建日志读取器代理作业。
如果发布数据库已存在日志读取器代理作业,请转到步骤 2。
如果不确定已发布数据库是否存在日志读取器代理作业,请在发布者的发布数据库上执行sp_helplogreader_agent(Transact-SQL)。 如果结果集为空,则必须创建日志读取器代理作业。
在发布服务器上,执行sp_addlogreader_agent(Transact-SQL)。 指定@job_name的代理在 Microsoft Windows 下运行,并提供@password的凭据。 如果代理在连接到发布服务器时将使用 SQL Server 身份验证,则还必须为 @publisher_security_mode 指定值 0,并为@publisher_login和@publisher_password指定Microsoft SQL Server 登录信息。
执行sp_addpublication(Transact-SQL),指定参数@allow_sync_tran的 true 值。
在发布服务器上,执行sp_addpublication_snapshot(Transact-SQL)。 指定步骤 2 中使用的发布名称用于 @publication,以及快照代理在 @job_name 和 @password 下运行的 Windows 凭据。 如果在连接到发布服务器时代理将使用 SQL Server 身份验证,则还必须为 @publisher_security_mode 指定值 0,并为@publisher_login和@publisher_password指定 SQL Server 登录信息。 这会为发布创建快照代理作业。
将文章添加到出版物中。 有关详细信息,请参阅 定义项目。
在订阅服务器上,创建对此发布的更新订阅。 有关详细信息,请参阅 创建事务性发布的可更新订阅。
创建支持排队更新订阅的发布
如有必要,请为发布数据库创建日志阅读器代理作业。
如果发布数据库已存在日志读取器代理作业,请转到步骤 2。
如果不确定已发布数据库是否存在日志读取器代理作业,请在发布者的发布数据库上执行sp_helplogreader_agent(Transact-SQL)。 如果结果集为空,则必须创建日志读取器代理作业。
在发布服务器上,执行sp_addlogreader_agent(Transact-SQL)。 指定代理在 @job_name 和 @password 下运行的 Windows 凭据。 如果在连接到发布服务器时代理将使用 SQL Server 身份验证,则还必须为 @publisher_security_mode 指定值 0,并为@publisher_login和@publisher_password指定 SQL Server 登录信息。
如有必要,请为分发器创建队列读取器代理作业。
如果分发数据库已存在队列读取器代理作业,请转到步骤 3。
如果不确定分发数据库是否存在队列读取器代理作业,请在分发服务器上的分发数据库上执行sp_helpqreader_agent(Transact-SQL)。 如果结果集为空,则必须创建队列读取器代理作业。
在分发服务器上,执行sp_addqreader_agent(Transact-SQL)。 指定代理在 @job_name 任务中运行时使用的 Windows 凭据,包括 @password。 当队列读取器代理连接到发布服务器和订阅服务器时,将使用这些凭据。 有关详细信息,请参阅 复制代理安全模式。
执行sp_addpublication(Transact-SQL),指定参数@allow_queued_tran的值为 true,并为@conflict_policy指定 pub wins、sub reinit 或 sub wins 的值。
在发布服务器上,执行sp_addpublication_snapshot(Transact-SQL)。 请在步骤 3 中指定用于@publication的发布名称,以及用于快照代理运行的 Windows 凭据,包括@snapshot_job_name和@password。 如果在连接到发布服务器时代理将使用 SQL Server 身份验证,则还必须为 @publisher_security_mode 指定值 0,并为@publisher_login和@publisher_password指定 SQL Server 登录信息。 这会为发布创建快照代理作业。
将文章添加到出版物中。 有关详细信息,请参阅 定义项目。
在订阅服务器上,创建对此发布的更新订阅。 有关详细信息,请参阅 创建事务性发布的可更新订阅。
更改允许排队更新订阅的发布的冲突策略
- 在发布者的发布数据库中执行sp_changepublication(Transact-SQL)。 为@property指定conflict_policy值,并为@value指定所需的冲突策略模式:发布者优先、订阅者重新初始化或订阅者优先。
示例 (Transact-SQL)
此示例创建一个支持即时和排队更新请求订阅的发布。
-- 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".
--Declarations for adding a transactional publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2012';
SET @publication = N'AdvWorksProductTran';
SET @login = $(Login);
SET @password = $(Password);
USE [AdventureWorks]
-- Enable transactional 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 transactional publication that supports immediate updating,
-- queued updating, and pull subscriptions.
EXEC sp_addpublication
@publication = @publication,
@status = N'active',
@allow_sync_tran = N'true',
@allow_queued_tran = N'true',
@allow_pull = N'true',
@independent_agent = N'true',
-- Explicitly declare the related default properties
@conflict_policy = N'pub wins';
-- 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
--Declarations for adding an article.
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product';
SET @owner = N'Production';
-- Add a horizontally and vertically filtered article for the Product table.
USE [AdventureWorks2012]
EXEC sp_addarticle
@publication = @publication,
@article = @article,
@source_table = @article,
@vertical_partition = N'false',
@type = N'logbased',
@source_owner = @owner,
@destination_owner = @owner;
GO
另请参阅
设置排队更新冲突解决选项 (SQL Server Management Studio)
事务复制的发布类型
可更新的事务复制订阅
创建出版物
创建事务发布的可更新订阅
可更新的事务复制订阅
将 sqlcmd 与脚本变量结合使用