sp_link_publication (Transact-SQL)

适用范围:SQL Server

设置在连接到发布服务器时立即更新订阅的同步触发器所使用的配置和安全信息。 此存储过程在订阅服务器的订阅数据库中执行。

重要

使用远程分发服务器配置发布服务器时,为所有参数(包括 @job_login@job_password)提供的值将作为纯文本发送到分发服务器。 在执行此存储过程之前,应该对发布服务器及其远程分发服务器之间的连接进行加密。 有关详细信息,请参阅将 SQL Server 数据库引擎配置为使用加密连接

Transact-SQL 语法约定

语法

sp_link_publication
    [ @publisher = ] N'publisher'
    , [ @publisher_db = ] N'publisher_db'
    , [ @publication = ] N'publication'
    , [ @security_mode = ] security_mode
    [ , [ @login = ] N'login' ]
    [ , [ @password = ] N'password' ]
    [ , [ @distributor = ] N'distributor' ]
[ ; ]

参数

[ @publisher = ] N'publisher'

要链接到的发布服务器的名称。 @publisher为 sysname,无默认值。

[ @publisher_db = ] N'publisher_db'

要链接到的发布服务器数据库的名称。 @publisher_dbsysname,无默认值。

[ @publication = ] N'publication'

要链接到的发布的名称。 @publicationsysname,无默认值。

[ @security_mode = ] security_mode

订阅服务器用于连接到远程发布服务器以立即更新的安全模式。 @security_modeint,可以是这些值之一。 请尽可能使用 Windows 身份验证。

说明
0 将此存储过程中指定的登录名用作 @login@password,使用 SQL Server 身份验证。

注意:在早期版本的 SQL Server 中,此选项用于指定动态远程过程调用(RPC)。
1 使用用户在订阅服务器上进行更改的安全上下文(SQL Server 身份验证或 Windows 身份验证)。

注意:此帐户还必须存在于具有足够权限的发布服务器上。 使用 Windows 身份验证时,必须支持安全帐户委派。
2 使用使用创建 sp_link_publication的现有用户定义的链接服务器登录名。

[ @login = ] N'login'

登录名。 @login为 sysname,默认值为 NULL. 当@security_mode0时,必须指定此参数。

[ @password = ] N'password'

密码。 @password为 sysname,默认值为 NULL. 当@security_mode0时,必须指定此参数。

[ @distributor = ] N'distributor'

分发服务器的名称。 @distributor为 sysname,默认值为空字符串。

返回代码值

0(成功)或 1(失败)。

注解

sp_link_publication 通过立即更新事务复制中的订阅来使用。

sp_link_publication 可用于推送订阅和请求订阅。 在创建订阅之前或之后都可以调用此过程。 在MSsubscription_properties系统表中插入或更新条目。

对于推送订阅,可以通过sp_subscription_cleanup清理条目。 对于拉取订阅,可以通过sp_droppullsubscriptionsp_subscription_cleanup来清理条目。 还可以使用NULL密码进行调用sp_link_publication,以清除MSsubscription_properties系统表中的条目,以引起安全问题。

当订阅服务器连接到发布服务器时,立即更新订阅服务器使用的默认模式不允许使用 Windows 身份验证进行连接。 若要用 Windows 身份验证模式进行连接,则必须设置到发布服务器的链接服务器,且立即更新订阅服务器在更新订阅服务器时应使用该连接。 这要求 sp_link_publication 运行 @security_mode 设置为 2. 使用 Windows 身份验证时,必须支持安全帐户委派。

示例

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

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

权限

只有 sysadmin 固定服务器角色的成员才能执行sp_link_publication