创建适用于事务发布的可更新订阅(Management Studio)

注释

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

事务复制允许在订阅服务器上进行的更改通过即时或排队更新的订阅传播回发布服务器。 可以使用复制存储过程以编程方式创建更新订阅。

“新建订阅向导”的“可更新订阅”页上配置可更新订阅。 只有在您的可更新订阅启用了事务性发布后,此页面才可访问。 有关启用可更新的订阅的详细信息,请参阅 为事务发布启用更新订阅

从发布服务器配置可更新的订阅

  1. 在 SQL Server Management Studio 中连接到发布服务器,然后展开该服务器节点。

  2. 展开 “复制 ”文件夹,然后展开 “本地发布” 文件夹。

  3. 右键单击一个启用更新订阅的事务发布,然后单击“新建订阅”。

  4. 按照向导中的各个页面设置订阅选项,例如分发代理应在哪运行。

  5. “新建订阅向导”的“可更新订阅”页上,确保已选择“复制”。

  6. “发布服务器提交 ”下拉列表中选择一个选项:

    • 若要使用即时更新订阅,请选择 “同时提交更改”。 如果选择此选项,并且发布允许排队更新订阅(这是通过新建发布向导创建的发布的默认设置),则订阅属性 update_mode 会被设置为 故障转移。 此模式允许稍后切换为排队更新(如有必要)。
    • 若要使用排队更新订阅,请选择 队列更改并在可能时提交。 如果选择此选项,并且发布允许订阅立即更新(这是使用新建发布向导创建的发布的默认设置),并且订阅服务器正在运行 SQL Server 2005 或更高版本,则订阅属性 update_mode 被设置为队列故障转移。 此模式允许你根据需要切换为稍后立即更新。

    有关切换更新模式的信息,请参阅 可更新事务订阅的更新模式之间的切换

  7. 对于使用即时更新或设置为排队故障转移update_mode的订阅,将显示“可更新订阅的登录页面”。 在“可更新订阅登录”页上,指定用于连接到发布服务器的链接服务器,以便实现订阅的即时更新。 连接由在订阅服务器上触发的触发器使用,并将更改传播到发布服务器。 选择以下任一选项:

    • 创建使用 SQL Server 身份验证进行连接的链接服务器。 如果未在订阅服务器和发布服务器之间定义远程服务器或链接服务器,请选择此选项。 复制会为你创建一个链接服务器。 指定的帐户必须已存在于发布服务器上。
    • 使用已定义的链接服务器或远程服务器。 如果使用 sp_addserver(Transact-SQL)、sp_addlinkedserver(Transact-SQL)、SQL Server Management Studio 或其他方法在订阅服务器和发布服务器之间定义了远程服务器或链接服务器,请选择此选项。

    有关链接服务器帐户所需的权限信息,请参阅此处输入链接说明中的排队更新订阅

  8. 完成安装向导。

从订阅服务器配置可更新的订阅

  1. 在 SQL Server Management Studio 中连接到订阅服务器,然后展开服务器节点。

  2. 展开 “复制 ”文件夹。

  3. 右键单击 “本地订阅 ”文件夹,然后单击“ 新建订阅”。

  4. “新建订阅向导”的“发布”页上,从“发布服务器”下拉列表中选择“查找 SQL Server 发布服务器”。

  5. 在“连接到服务器”对话框中连接到发布者。

  6. 选择一个在 发布 页面上启用了更新订阅的事务发布。

  7. 根据向导中的各个页面,指定订阅选项,例如选择分发代理的运行位置。

  8. 在“新建订阅向导”的 “可更新订阅 ”页上,确保已选择 “复制 ”。

  9. “发布服务器提交 ”下拉列表中选择一个选项:

    • 若要使用即时更新订阅,请选择 “同时提交更改”。 如果选择此选项,并且发布设置允许排队更新订阅(这是使用新建发布向导创建的发布的默认值),则订阅属性 update_mode 将设置为 故障转移。 此模式允许稍后切换为排队更新(如有必要)。
    • 若要使用排队更新订阅,请选择 “队列更改”,并尽可能提交。 如果选择此选项,并且发布允许立即更新订阅(这是使用新建发布向导创建的发布的默认设置),并且订阅服务器正在运行 SQL Server 2005 或更高版本,则订阅属性 update_mode 设置为排队 故障切换。 此模式允许你根据需要切换为稍后立即更新。

    有关切换更新模式的信息,请参阅 可更新事务订阅的更新模式之间的切换

  10. 对于使用即时更新的订阅或者update_mode设置为故障转移排队的订阅,将显示更新订阅登录页面。 在“可更新订阅的登录页”上,指定用于连接到发布者的链接服务器,以便立即更新订阅。 连接由在订阅服务器上触发的触发器使用,并将更改传播到发布服务器。 选择以下任一选项:

    • 创建使用 SQL Server 身份验证进行连接的链接服务器。 如果未在订阅服务器和发布服务器之间定义远程服务器或链接服务器,请选择此选项。 复制过程会给你创建一个链接服务器。 指定的帐户必须已存在于发布服务器上。
    • 使用已定义的链接服务器或远程服务器。 如果使用 sp_addserver(Transact-SQL)、sp_addlinkedserver(Transact-SQL)、SQL Server Management Studio 或其他方法在订阅服务器和发布服务器之间定义了远程服务器或链接服务器,请选择此选项。

    有关链接服务器帐户所需的权限的信息,请参阅此处输入链接说明排队更新订阅

  11. 完成安装向导。

创建即时更新请求订阅

  1. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持立即更新订阅。

    • 如果结果集中的值 allow_sync_tran1,则发布支持即时更新订阅。
    • 如果结果集中的值 allow_sync_tran0,则必须重新创建发布,并启用立即更新的订阅。
  2. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持请求订阅。

    • 如果结果集中的 allow_pull 值为 1,则发布支持拉取订阅。
    • 如果allow_pull的值为0,则执行sp_changepublication,指定allow_pull@propertytrue@value
  3. 在订阅服务器上,执行 sp_addpullsubscription。 指定 @publisher@publication,以及为 @update_mode 指定以下值之一:

    • sync tran - 启用订阅以立即更新。
    • failover - 启用订阅功能,以便在立即更新失败时,作为备用选项进行排队更新。

    注释

failover 要求也为排队更新订阅启用发布。

  1. 在订阅服务器上,执行 sp_addpullsubscription_agent。 指定以下内容:

    • 参数@publisher, @publisher_db@publication
    • 订阅方中分发代理运行所依据的 Microsoft Windows 凭据@job_login@job_password

    注释

使用 Windows 集成身份验证建立的连接始终使用由 @job_login@job_password指定的 Windows 凭据进行。 分发代理始终使用 Windows 集成身份验证与订阅服务器建立本地连接。 默认情况下,代理使用 Windows 集成身份验证连接到分发服务器。

* (Optional) A value of `0` for `@distributor_security_mode` and the Microsoft SQL Server login information for `@distributor_login` and `@distributor_password`, if you need to use SQL Server Authentication when connecting to the Distributor. 
* A schedule for the Distribution Agent job for this subscription. 
  1. 在订阅服务器上的订阅数据库上,执行 sp_link_publication。 指定 @publisher@publication@publisher_db的出版物数据库名称以及以下值之一:@security_mode

    • 0 - 在发布服务器上进行更新时使用 SQL Server 身份验证。 此选项要求你在发布者处为@login@password指定有效的登录名。
    • 1 - 连接到发布服务器时,使用用户在订阅服务器上进行更改的安全上下文。 有关与此安全模式相关的限制,请参阅 sp_link_publication
    • 2 - 使用使用 sp_addlinkedserver创建的现有用户定义的链接服务器登录名。
  2. 在发布服务器上,执行sp_addsubscription指定@publication@subscriber@destination_db请求@subscription_type的值,以及步骤 3 @update_mode中指定的相同值。

这会在发布者处注册拉取订阅。

创建立即更新推送订阅

  1. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持立即更新订阅。

    • 如果结果集中的值 allow_sync_tran1,则发布允许立即更新订阅。
    • 如果结果集中的值 allow_sync_tran0,则必须重新发布,并为订阅启用立即更新功能。
  2. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持推送订阅。

    • 如果结果集中的值 allow_push1,则发布支持推送订阅。
    • 如果allow_push的值是0,则执行sp_changepublication,指定allow_push@propertytrue@value
  3. 在发布服务器上,执行 sp_addsubscription。 指定@publication@subscriber@destination_db@update_mode的以下值之一:

    • sync tran - 支持立即更新。
    • failover - 支持使用排队更新作为故障转移选项进行即时更新。

    注释

failover 要求也为排队更新订阅启用发布。

  1. 在发布服务器上,执行 sp_addpushsubscription_agent。 指定下列参数:

    • @subscriber@subscriber_db@publication
    • 分发服务器中分发代理在@job_login@job_password运行时所使用的Windows凭据。

    注释

使用 Windows 集成身份验证建立的连接始终使用由 @job_login@job_password指定的 Windows 凭据进行。 分发代理始终使用 Windows 集成身份验证与分发服务器建立本地连接。 默认情况下,代理将使用 Windows 集成身份验证连接到订阅服务器。

* (Optional) A value of `0` for `@subscriber_security_mode` and the SQL Server login information for `@subscriber_login` and `@subscriber_password`, if you need to use SQL Server Authentication when connecting to the Subscriber. 
* A schedule for the Distribution Agent job for this subscription.
  1. 在订阅数据库的订阅服务器上,执行 sp_link_publication。 指定@publisher@publication@publisher_db对应的发布数据库的名称,以及@security_mode的下列值之一:

    • 0 - 在发布服务器上进行更新时使用 SQL Server 身份验证。 此选项要求你在发布者处指定有效的登录名@login@password
    • 1 - 连接到发布服务器时,使用用户在订阅服务器上进行更改的安全上下文。 有关与此安全模式相关的限制,请参阅 sp_link_publication
    • 2 - 使用现有的、用户定义的链接服务器登录名,该登录名是通过 sp_addlinkedserver 创建的。

创建排队更新请求订阅

  1. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持排队更新订阅。

    • 如果结果集中的 allow_queued_tran 的值为 1,则该发布支持立即更新订阅。
    • 如果结果集中的值 allow_queued_tran0,则必须在启用排队更新订阅的情况下重新创建发布项。
  2. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持请求订阅。

    • 如果结果集中的值 allow_pull1,则发布支持请求订阅。
    • 如果allow_pull的值为0,则执行sp_changepublication,指定allow_pull@property,指定true@value
  3. 在订阅端,执行 sp_addpullsubscription。 指定 @publisher@publication,以及 @update_mode 的以下值之一:

    • queued tran - 启用排队更新的订阅。
    • queued failover - 支持使用即时更新作为备用选项进行队列更新。

    注释

queued failover 要求启用发布以支持订阅的即时更新。 若要切换到立即更新模式,必须使用 sp_link_publication 来定义订阅者将更改复制到发布者所需的凭据。

  1. 在订阅服务器上,执行 sp_addpullsubscription_agent。 指定下列参数:

    • @publisher、 @publisher_db@publication
    • 在订阅服务器上,分发代理为@job_login@job_password运行时使用的Windows凭据。

    注释

使用 Windows 集成身份验证建立的连接始终使用由 @job_login@job_password指定的 Windows 凭据进行。 分发代理始终使用 Windows 集成身份验证与订阅服务器建立本地连接。 默认情况下,代理使用 Windows 集成身份验证连接到分发服务器。

* (Optional) A value of `0` for `@distributor_security_mode` and the SQL Server login information for `@distributor_login` and `@distributor_password`, if you need to use SQL Server Authentication when connecting to the Distributor. 
* A schedule for the Distribution Agent job for this subscription.
  1. 在发布服务器上,执行sp_addsubscriber以在发布服务器上注册订阅服务器,指定@publication@subscriber@destination_db,将@subscription_type的值设为 pull,并指定与步骤 3 中@update_mode相同的值。

这会在发布者处注册拉取订阅。

创建排队更新推送订阅

  1. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持排队更新订阅。

    • 如果结果集中的allow_queued_tran值为 1,则该发布支持立即更新的订阅。
    • 如果结果集中的 allow_queued_tran 值为 0,则必须重新创建发布,并启用排队更新订阅功能。 有关更多信息,请参阅“如何:为事务性发布启用更新订阅”(复制 Transact-SQL 编程)。
  2. 在发布服务器上,通过执行 sp_helppublication来验证发布是否支持推送订阅。

    • 结果集中的值 allow_push 如果是 1,则表示该发布支持推送订阅。
    • 如果 allow_push 的值是 0,则执行 sp_changepublication,并指定 @property 为 allow_push,以及 @valuetrue
  3. 在发布服务器上,执行 sp_addsubscription。 指定@publication@subscriber@destination_db@update_mode的以下值之一:

    • queued tran - 启用排队更新的订阅。
    • queued failover - 支持队列更新,并提供即时更新作为故障转移选项。

    注释

发布的排队故障转移选项要求必须为立即更新订阅启用。 如果要切换到立即更新模式,必须使用 sp_link_publication 来定义订阅方更改复制到发布方的凭证。

  1. 在发布服务器上,执行 sp_addpushsubscription_agent。 指定下列参数:

    • @subscriber@subscriber_db@publication
    • 在分发服务器中,分发代理为 @job_login@job_password 运行时使用的 Windows 凭据。

    注释

使用 Windows 集成身份验证建立的连接始终使用由 @job_login@job_password指定的 Windows 凭据进行。 分发代理始终使用 Windows 集成身份验证与分发服务器建立本地连接。 默认情况下,代理使用 Windows 集成身份验证连接到订阅服务器。

* (Optional) A value of `0` for `@subscriber_security_mode` and the SQL Server login information for `@subscriber_login` and `@subscriber_password`, if you need to use SQL Server Authentication when connecting to the Subscriber. 
* A schedule for the Distribution Agent job for this subscription.

示例:

此示例将立即更新请求订阅创建到支持立即更新订阅的发布。 使用 sqlcmd 脚本变量在运行时提供登录名和密码值。

注释

此脚本使用 sqlcmd 脚本变量。 它们采用形式 $(MyVariable)。 有关如何在命令行和 SQL Server Management Studio 中使用脚本变量的信息,请参阅“复制系统存储过程概念”主题中的“执行复制脚本”部分。

-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS nvarchar(512);
SET @publication = N'AdvWorksProductTran';
SET @publicationDB = N'AdventureWorks2008R2';
SET @publisher = $(PubServer);
SET @login = $(Login);
SET @password = $(Password);

-- At the subscription database, create a pull subscription to a transactional 
-- publication using immediate updating with queued updating as a failover.
EXEC sp_addpullsubscription 
    @publisher = @publisher, 
    @publication = @publication, 
    @publisher_db = @publicationDB, 
    @update_mode = N'failover', 
    @subscription_type = N'pull';

-- Add an agent job to synchronize the pull subscription, 
-- which uses Windows Authentication when connecting to the Distributor.
EXEC sp_addpullsubscription_agent 
    @publisher = @publisher, 
    @publisher_db = @publicationDB, 
    @publication = @publication,
    @job_login = @login,
    @job_password = @password; 

-- Add a Windows Authentication-based linked server that enables the 
-- Subscriber-side triggers to make updates at the Publisher. 
EXEC sp_link_publication 
    @publisher = @publisher, 
    @publication = @publication,
    @publisher_db = @publicationDB, 
    @security_mode = 0,
    @login = @login,
    @password = @password;
GO

USE AdventureWorks2008R2;
GO

-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriptionDB AS sysname;
DECLARE @subscriber AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @subscriptionDB = N'AdventureWorks2008R2Replica'; 
SET @subscriber = $(SubServer);

-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2008R2]
EXEC sp_addsubscription 
    @publication = @publication, 
    @subscriber = @subscriber, 
    @destination_db = @subscriptionDB, 
    @subscription_type = N'pull', 
    @update_mode = N'failover';
GO

设置排队更新冲突解决选项 (SQL Server Management Studio)

“发布属性 - <发布>”对话框的“订阅选项”页上,为支持排队更新订阅的发布设置冲突解决选项。 有关访问此对话框的详细信息,请参阅 “查看和修改发布属性”。

设置排队更新冲突解决选项

  1. “发布属性 - <发布>”对话框的“订阅选项”页上,为“冲突解决策略”选项选择以下值之一:
    • 保留发布者更改
    • 保留订阅者更改
    • 重新初始化订阅
  2. 单击 “确定”

另请参阅

创建出版物
可更新的事务复制订阅
将 sqlcmd 与脚本变量结合使用