对事务发布启用更新订阅

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 为 SQL Server 2014 中的事务发布启用更新订阅。

注意

后续版本的 Microsoft SQL Server 将删除该功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

开始之前

安全性

如果可能,请在运行时提示用户输入安全凭据。 如果必须在脚本文件中存储凭据,则必须保护文件以防止未经授权的访问。

使用 SQL Server Management Studio

可以在新建发布向导的 “发布类型” 页上对事务发布启用更新订阅。 有关使用此向导的详细信息,请参阅创建发布。 不能在创建发布之后启用更新订阅。

若要使用更新订阅,还必须在新建订阅向导中配置一些选项。 有关详细信息,请参阅 创建事务发布的可更新订阅

启用更新订阅

  1. 在新建发布向导的 “发布类型” 页上选择 “具有可更新订阅的事务发布”

  2. “代理安全性” 页上,除了为快照代理和日志读取器代理指定安全设置外,还要为队列读取器代理指定安全设置。 有关运行队列读取器代理的帐户所需权限的详细信息,请参阅 Replication Agent Security Model

    注意

    即使仅使用即时更新订阅,也要配置队列读取器代理。

“使用 Transact-SQL”

在使用复制存储过程以编程方式创建事务发布时,您可以启用立即或排队更新订阅。

创建支持立即更新订阅的发布

  1. 如有必要,可为发布数据库创建一个日志读取器代理作业。

    • 如果发布数据库中已经有一个日志读取器代理作业,请继续执行步骤 2。

    • 如果不确定已发布数据库是否存在日志读取器代理作业,请在发布服务器上对发布数据库执行 sp_helplogreader_agent (Transact-SQL) 。 如果结果集为空,则必须创建日志读取器代理作业。

    • 在发布服务器上, sp_addlogreader_agent (执行 Transact-SQL) 。 为 @job_name@password指定运行代理时所依据的 Microsoft Windows 凭据。 如果代理在连接到发布服务器时将使用 SQL Server 身份验证,则还必须将 @publisher_security_mode 的值指定为 0,并为@publisher_login和@publisher_password指定 Microsoft SQL Server登录信息。

  2. 执行 sp_addpublication (Transact-SQL) ,将参数@allow_sync_tran的值指定为 true

  3. 在发布服务器上,执行sp_addpublication_snapshot (Transact-SQL)。 指定步骤 2 中用于@publication的发布名称,并为@job_name和@password指定运行快照代理所使用的 Windows 凭据。 如果代理在连接到发布服务器时将使用SQL Server身份验证,则还必须将 @publisher_security_mode 的值指定为 0,并为@publisher_login和@publisher_password指定SQL Server登录信息。 此操作将为发布创建一个快照代理作业。

  4. 向发布添加项目。 有关详细信息,请参阅 定义项目

  5. 在订阅服务器上,创建此发布的更新订阅。 有关详细信息,请参阅 创建事务发布的可更新订阅

创建支持排队更新订阅的发布

  1. 如有必要,可为发布数据库创建一个日志读取器代理作业。

    • 如果发布数据库中已经有一个日志读取器代理作业,请继续执行步骤 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登录信息。

  2. 如有必要,可为分发服务器创建一个队列读取器代理作业。

    • 如果分发数据库已经拥有一个队列读取器代理作业,请继续执行步骤 3。

    • 如果不确定分发数据库是否存在队列读取器代理作业,请在分发服务器上对分发数据库执行 sp_helpqreader_agent (Transact-SQL) 。 如果结果集为空,则必须创建一个队列读取器代理作业。

    • 在分发服务器上, sp_addqreader_agent (执行 Transact-SQL) 。 为 @job_name@password指定运行代理时所依据的 Windows 凭据。 这些凭据将在队列读取器代理连接到发布服务器和订阅服务器时使用。 有关详细信息,请参阅 复制代理安全模式

  3. 执行 sp_addpublication (Transact-SQL) ,为参数@allow_queued_tran指定值为 true,并为@conflict_policy指定 pub winssub reinitsub wins 的值。

  4. 在发布服务器上,执行sp_addpublication_snapshot (Transact-SQL)。 指定步骤 3 中用于@publication的发布名称,并为@snapshot_job_name和@password指定运行快照代理所使用的 Windows 凭据。 如果代理在连接到发布服务器时将使用SQL Server身份验证,则还必须将 @publisher_security_mode 的值指定为 0,并为@publisher_login和@publisher_password指定SQL Server登录信息。 此操作将为发布创建一个快照代理作业。

  5. 向发布添加项目。 有关详细信息,请参阅 定义项目

  6. 在订阅服务器上,创建此发布的更新订阅。 有关详细信息,请参阅 创建事务发布的可更新订阅

为允许排队更新订阅的发布更改冲突策略

  1. 在发布服务器上,对发布数据库执行 sp_changepublication (Transact-SQL) 。 为@property指定值conflict_policy,并为@value指定所需的冲突策略模式 pub winssub reinitsub wins

示例 (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)
事务复制的发布类型
Updatable Subscriptions for Transactional Replication
创建发布
创建事务发布的可更新订阅
Updatable Subscriptions for Transactional Replication
将 sqlcmd 与脚本变量结合使用