Как создавать принудительные подписки (программирование репликации Transact-SQL)

Принудительные подписки могут быть созданы программно, с помощью хранимых процедур репликации. Какие именно хранимые процедуры будут при этом применяться, зависит от типа публикации, к которой относится подписка.

Примечание по безопасностиПримечание по безопасности

По возможности следует предлагать пользователям вводить учетные данные безопасности во время выполнения приложения. Если же возникла необходимость хранения учетных данных в файле сценария, то этот файл следует защитить от несанкционированного доступа.

Создание принудительной подписки на публикацию моментальных снимков или транзакций

  1. На издателе в базе данных публикации с помощью процедуры sp_helppublication проверьте, поддерживает ли публикация принудительные подписки.

    • Если значение allow_push равно 1, то принудительная подписка поддерживается.

    • Если значение allow_push равно 0, то необходимо выполнить процедуру sp_changepublication, указав allow_push в @property и значение true в @value.

  2. На издателе в базе данных публикации выполните хранимую процедуру sp_addsubscription. Укажите @publication, @subscriber и @destination_db. Укажите значение push в качестве параметра @subscription_type. Сведения об обновлении подписок см. в разделе Как создать обновляемую подписку на публикацию транзакций (программирование репликации на языке Transact-SQL).

  3. На издателе в базе данных публикации выполните хранимую процедуру sp_addpushsubscription_agent. Укажите следующие параметры:

    • @subscriber, @subscriber_db и @publication.

    • Учетные данные Microsoft Windows, с которыми будет запускаться агент распространителя на распространителе в параметре @job_login, а пароль — в параметре @job_password.

      ПримечаниеПримечание

      Для соединений, производимых с использованием встроенной проверки подлинности Windows, в параметрах @job_login и @job_password всегда указываются учетные данные Windows. Агент распространителя всегда создает локальные соединения с распространителем через встроенную систему проверки подлинности Windows. По умолчанию агент подключается к подписчику через встроенную систему проверки подлинности Windows.

    • (необязательно) Значение 0 в параметре @subscriber_security_mode и сведения об имени входа Microsoft SQL Server в параметрах @subscriber_login и @subscriber_password. Эти параметры указываются в том случае, если при соединении с подписчиком необходимо использовать проверку подлинности SQL Server.

    • Расписание агента распространителя для данной подписки. Дополнительные сведения см. в разделе Как определить расписания синхронизации (программирование репликации на языке Transact-SQL).

    Примечание по безопасностиПримечание по безопасности

    При создании принудительной подписки на издателе с удаленным распространителем значения, указываемые для всех параметров, включая job_login и job_password, передаются распространителю в виде незашифрованного текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе Шифрование соединений с SQL Server.

Создание принудительной подписки на публикацию слиянием

  1. На издателе в базе данных публикации при помощи процедуры sp_helpmergepublication проверьте, поддерживает ли публикация принудительные подписки.

    • Если значение allow_push равно 1, то публикацией принудительные подписки поддерживаются.

    • Если значение allow_push не равно 1, необходимо выполнить процедуру sp_changemergepublication, значение allow_push в параметре @property и значение true в параметре @value.

  2. На издателе в базе данных публикации выполните хранимую процедуру sp_addmergesubscription, указав следующие параметры.

  3. На издателе в базе данных публикации выполните хранимую процедуру sp_addmergepushsubscription_agent. Укажите следующие параметры:

    • @subscriber, @subscriber_db и @publication.

    • Учетные данные Windows, с которыми будет запускаться агент слияния на распространителе в параметрах @job_login и @job_password.

      ПримечаниеПримечание

      Для соединений, производимых с использованием встроенной проверки подлинности Windows, в параметрах @job_login и @job_password всегда указываются учетные данные Windows. Агент слияния всегда создает локальные соединения с распространителем через встроенную систему проверки подлинности Windows. По умолчанию агент подключается к подписчику через встроенную систему проверки подлинности Windows.

    • (необязательно) Значение 0 в параметре @subscriber_security_mode и сведения об имени входа SQL Server в параметрах @subscriber_login и @subscriber_password. Эти параметры указываются в том случае, если при соединении с подписчиком необходимо использовать проверку подлинности SQL Server.

    • (необязательно) Значение 0 в параметре @publisher_security_mode и сведения об имени входа SQL Server в параметрах @publisher_login и @publisher_password. Эти параметры указываются в том случае, если при соединении с издателем необходимо использовать проверку подлинности SQL Server.

    • Расписание агента слияния для данной подписки. Дополнительные сведения см. в разделе Как определить расписания синхронизации (программирование репликации на языке Transact-SQL).

    Примечание по безопасностиПримечание по безопасности

    При создании принудительной подписки на издателе с удаленным распространителем значения, указываемые для всех параметров, включая job_login и job_password, передаются распространителю в виде незашифрованного текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе Шифрование соединений с SQL Server.

Пример

В следующем примере создается принудительная подписка на публикацию транзакций. Значения для имени входа и пароля передаются во время выполнения через переменные сценария 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".

DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2008R2Replica';

--Add a push subscription to a transactional publication.
USE [AdventureWorks2008R2]
EXEC sp_addsubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @destination_db = @subscriptionDB, 
  @subscription_type = N'push';

--Add an agent job to synchronize the push subscription.
EXEC sp_addpushsubscription_agent 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @job_login = $(Login), 
  @job_password = $(Password);
GO

В следующем примере создается принудительная подписка на публикацию слиянием. Значения для имени входа и пароля передаются во время выполнения через переменные сценария 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".

DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2008R2Replica'; 
SET @hostname = N'adventure-works\david8'

-- Add a push subscription to a merge publication.
USE [AdventureWorks2008R2]
EXEC sp_addmergesubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @subscription_type = N'push',
  @hostname = @hostname;

--Add an agent job to synchronize the push subscription.
EXEC sp_addmergepushsubscription_agent 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @job_login = $(Login), 
  @job_password = $(Password);
GO