启用事务性发布的更新订阅功能

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

注释

此功能将在Microsoft SQL Server 的未来版本中删除。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

在您开始之前

安全

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

使用 SQL Server Management Studio

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

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

允许更新订阅

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

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

    注释

    队列读取器代理即使在仅使用即时更新订阅的情况下也会被配置。

使用 Transact-SQL

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

创建一个可以立即更新订阅的发布物

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

    • 如果发布数据库已存在日志读取器代理作业,请转到步骤 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 登录信息。

  2. 执行sp_addpublication(Transact-SQL),指定参数@allow_sync_trantrue 值。

  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 任务中运行时使用的 Windows 凭据,包括 @password。 当队列读取器代理连接到发布服务器和订阅服务器时,将使用这些凭据。 有关详细信息,请参阅 复制代理安全模式

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

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

  5. 将文章添加到出版物中。 有关详细信息,请参阅 定义项目

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

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

  1. 在发布者的发布数据库中执行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 与脚本变量结合使用