适用于:SQL Server
本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中启用事务发布的订阅更新。
注意
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
开始之前
安全性
如果可能,请在运行时提示用户输入安全凭据。 如果必须在脚本文件中存储凭据,则必须保护文件以防止未经授权的访问。
使用 SQL Server Management Studio
可以在新建发布向导的 “发布类型” 页上对事务发布启用更新订阅。
若要使用更新订阅,还必须在新建订阅向导中配置一些选项。
启用更新订阅
- 在新建发布向导的 “发布类型” 页上选择 “具有可更新订阅的事务发布”。 
- 在 “代理安全性” 页上,除了为快照代理和日志读取器代理指定安全设置外,还要为队列读取器代理指定安全设置。 有关运行队列读取器代理的帐户所需权限的详细信息,请参阅 Replication Agent Security Model。 - 注意 - 即使仅使用即时更新订阅,也要配置队列读取器代理。 
“使用 Transact-SQL”
在使用复制存储过程以编程方式创建事务发布时,您可以启用立即或排队更新订阅。
创建支持立即更新订阅的发布
- 如有必要,可为发布数据库创建一个日志读取器代理作业。 - 如果发布数据库中已经有一个日志读取器代理作业,请继续执行步骤 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指定 Microsoft SQL Server 登录信息。 
 
- 执行 sp_addpublication (Transact-SQL) 并将参数 allow_sync_tran 的值指定为“true”。 
- 在发布服务器上,执行sp_addpublication_snapshot (Transact-SQL)。 为 @publication 指定在步骤 2 中使用的发布名称,并为 @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)。 将运行该代理时所使用的 Windows 凭据指定给 @job_name 和 @password。 如果代理在连接到发布服务器时使用 SQL Server 身份验证,则还必须将 @publisher_security_mode 的值指定为“0”,并为 @publisher_login 和 @publisher_password指定 SQL Server 登录信息。 
 
- 如有必要,可为分发服务器创建一个队列读取器代理作业。 - 如果分发数据库已经拥有一个队列读取器代理作业,请继续执行步骤 3。 
- 如果无法确定分发数据库是否已经拥有一个队列读取器代理作业,请在分发数据库中的分发服务器上执行 sp_helpqreader_agent (Transact-SQL)。 如果结果集为空,则必须创建一个队列读取器代理作业。 
- 在分发服务器上,执行 sp_addqreader_agent (Transact-SQL)。 将运行该代理时所使用的 Windows 凭据指定给 @job_name 和 @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)。 将值 conflict_policy 指定给 @property ,并为 @value指定所需的冲突策略模式 pub wins、 sub reinit 或 sub 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'AdventureWorks2022'; 
SET @publication = N'AdvWorksProductTran'; 
SET @login = $(Login); 
SET @password = $(Password); 
USE [AdventureWorks2022]
-- 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 [AdventureWorks2022]
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @article, 
    @source_table = @article, 
    @vertical_partition = N'false', 
    @type = N'logbased',
    @source_owner = @owner, 
    @destination_owner = @owner;
GO