如何创建对事务发布的可更新订阅(复制 Transact-SQL 编程)

注意注意

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

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

创建立即更新请求订阅

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

  2. 在发布服务器上,通过执行 sp_helppublication 验证发布是否支持请求订阅。

    • 如果结果集中 allow_pull 的值为 1,说明该发布支持请求订阅。

    • 如果 allow_pull0,请执行 sp_changepublication,并将 **@property** 和 **@value** 分别指定为 allow_pull 和 true。

  3. 在订阅服务器上,执行 sp_addpullsubscription。指定 **@publisher** 和 **@publication**,并将 **@update\_mode** 指定为以下值之一:

    • synctran - 使订阅支持立即更新。

    • failover - 使订阅支持立即更新,并且将排队更新作为故障转移选项。

      注意注意

      failover 要求发布也支持排队更新订阅。

  4. 在订阅服务器上,执行 sp_addpullsubscription_agent。指定下列各项:

    • **@publisher**、**@publisher\_db** 和 **@publication** 参数。

    • 订阅服务器中的分发代理运行时所使用的 Microsoft Windows 凭据:**@job\_login** 和 **@job\_password**。

      注意注意

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

    • (可选)**@distributor\_security\_mode** 的 0 值以及 **@distributor\_login** 和 **@distributor\_password** 的 MicrosoftSQL Server 登录信息,如果您需要在连接到分发服务器时使用 SQL Server 身份验证,请指定这些参数。

    • 该订阅的分发代理作业计划。有关详细信息,请参阅如何指定同步计划(复制 Transact-SQL 编程)

  5. 在订阅服务器上的订阅数据库中,执行 sp_link_publication。指定 **@publisher** 和 **@publication**,将 **@publisher\_db** 指定为发布数据库的名称,并将 **@security\_mode** 指定为以下值之一:

    • 0 - 在发布服务器上进行更新时使用 SQL Server 身份验证。此选项需要为 **@login** 和 **@password** 指定发布服务器上的一个有效登录名。

    • 1 - 在连接到发布服务器时,使用在订阅服务器上执行更改的用户的安全上下文。请参阅 sp_link_publication,了解与此安全模式相关的限制。

    • 2 - 使用现有的、用户定义的链接服务器登录名,该登录名是使用 sp_addlinkedserver 创建的。

  6. 在发布服务器上,执行 sp_addsubscription,并指定 **@publication**、**@subscriber** 和 **@destination\_db**,同时将 **@subscription\_type** 指定为 pull 值,将 **@update\_mode** 指定为在步骤 3 中指定的相同值。

    这会在发布服务器上注册请求订阅。

创建立即更新推送订阅

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

  2. 在发布服务器上,通过执行 sp_helppublication 以验证发布是否支持推送订阅。

    • 如果结果集中 allow_push 的值为 1,说明该发布支持推送订阅。

    • 如果 allow_push0,请执行 sp_changepublication,并将 **@property** 和 **@value** 分别指定为 allow_push 和 true。

  3. 在发布服务器上,执行 sp_addsubscription。指定 **@publication**、**@subscriber** 和 **@destination\_db**,并将 **@update\_mode** 指定为以下值之一:

    • synctran - 支持立即更新。

    • failover - 支持立即更新,并且将排队更新作为故障转移选项。

      注意注意

      failover 要求发布也支持排队更新订阅。

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

    • **@subscriber**、**@subscriber\_db** 和 **@publication**。

    • 分发服务器中的分发代理运行时所使用的 **@job\_login** 和 **@job\_password** 指定的 Windows 凭据。

      注意注意

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

    • (可选)@subscriber\_security\_mode** 的 0 值,以及 SQL Server 登录信息:@subscriber\_login** 和 **@subscriber\_password**,如果您需要在连接到订阅服务器时使用 SQL Server 身份验证,则指定这些参数。

    • 该订阅的分发代理作业计划。有关详细信息,请参阅如何指定同步计划(复制 Transact-SQL 编程)

  5. 在订阅服务器上的订阅数据库中,执行 sp_link_publication。指定 **@publisher** 和 **@publication**,为 **@publisher\_db** 指定发布数据库的名称,并为 **@security\_mode** 指定下列值之一:

    • 0 - 在发布服务器上进行更新时使用 SQL Server 身份验证。此选项需要为 **@login** 和 **@password** 指定发布服务器上的一个有效登录名。

    • 1 - 在连接到发布服务器时,使用在订阅服务器上执行更改的用户的安全上下文。请参阅 sp_link_publication,了解与此安全模式相关的限制。

    • 2 - 使用现有的、用户定义的链接服务器登录名,该登录名是使用 sp_addlinkedserver 创建的。

创建排队更新请求订阅

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

  2. 在发布服务器上,通过执行 sp_helppublication 验证发布是否支持请求订阅。

    • 如果结果集中 allow_pull 的值为 1,说明该发布支持请求订阅。

    • 如果 allow_pull0,请执行 sp_changepublication,并将 **@property** 和 **@value** 分别指定为 allow_pull 和 true。

  3. 在订阅服务器上,执行 sp_addpullsubscription。指定 **@publisher** 和 **@publication**,并将 **@update\_mode** 指定为以下值之一:

    • queued tran - 支持订阅进行排队更新。

    • queued failover - 支持排队更新,并将立即更新作为故障转移选项。

      注意注意

      queued failover 要求发布也支持立即更新订阅。若要故障转移到立即更新,必须使用 sp_link_publication 定义将订阅服务器上的更改复制到发布服务器所用的凭据。

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

    • **@publisher**、**@publisher\_db** 和 **@publication**。

    • 订阅服务器中的分发代理运行时所使用的 Windows 凭据:**@job\_login** 和 **@job\_password**。

      注意注意

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

    • (可选)**@distributor\_security\_mode** 的 0 值以及 **@distributor\_login** 和 **@distributor\_password** 的 SQL Server 登录信息,如果需要在连接到分发服务器时使用 SQL Server 身份验证,请指定这些参数。

    • 该订阅的分发代理作业计划。有关详细信息,请参阅如何指定同步计划(复制 Transact-SQL 编程)

  5. 在发布服务器上,执行 sp_addsubscriber (Transact-SQL) 以在发布服务器上注册订阅服务器。

    在发布服务器上,执行 sp_addsubscription,并指定 **@publication**、**@subscriber** 和 **@destination\_db**,同时将 **@subscription\_type** 指定为 pull 值,将 **@update\_mode** 指定为在步骤 3 中指定的相同值。

    这会在发布服务器上注册请求订阅。

创建排队更新推送订阅

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

  2. 在发布服务器上,通过执行 sp_helppublication 以验证发布是否支持推送订阅。

    • 如果结果集中 allow_push 的值为 1,说明该发布支持推送订阅。

    • 如果 allow_push0,请执行 sp_changepublication,并将 **@property** 和 **@value** 分别指定为 allow_push 和 true。

  3. 在发布服务器上,执行 sp_addsubscription。指定 **@publication**、**@subscriber** 和 **@destination\_db**,并将 **@update\_mode** 指定为以下值之一:

    • queued tran - 支持订阅进行排队更新。

    • queued failover - 支持排队更新,并将立即更新作为故障转移选项。

      注意注意

      queued failover 选项要求发布也支持立即更新订阅。若要故障转移到立即更新,必须使用 sp_link_publication 定义将订阅服务器上的更改复制到发布服务器所用的凭据。

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

    • **@subscriber**、**@subscriber\_db** 和 **@publication**。

    • 分发服务器中的分发代理运行时所使用的 **@job\_login** 和 **@job\_password** 指定的 Windows 凭据。

      注意注意

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

    • (可选)@subscriber\_security\_mode** 的 0 值,以及 SQL Server 登录信息:@subscriber\_login** 和 **@subscriber\_password**,如果您需要在连接到订阅服务器时使用 SQL Server 身份验证,则指定这些参数。

    • 该订阅的分发代理作业计划。有关详细信息,请参阅如何指定同步计划(复制 Transact-SQL 编程)

示例

本示例针对某个支持立即更新订阅的发布创建了一个立即更新请求订阅。登录名和密码在运行时使用 sqlcmd 脚本变量进行提供。

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".

-- 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'AdventureWorks';
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 AdventureWorks
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'AdventureWorksReplica'; 
SET @subscriber = $(SubServer);

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