Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server Управляемый экземпляр SQL Azure
В этом разделе описывается, как создать подписку с вытягиванием в SQL Server с помощью SQL Server Management Studio, Transact-SQL или объектов управления репликацией (RMO).
Настроить подписку по запросу для репликации P2P возможно с помощью скрипта, но не с помощью мастера.
Использование среды SQL Server Management Studio
Создайте подписку по запросу на издателе или подписчике с помощью мастера создания подписки. Следуйте инструкциям на страницах мастера, чтобы выполнить следующие действия:
Указать издателя и публикацию.
Укажите, где будут запускаться агенты репликации. Для подписки с вытягиванием выберите Запускать каждый агент на соответствующем подписчике (подписки с вытягиванием) на странице Расположение агента распространения или на странице Расположение агента слияния, в зависимости от типа публикации.
Указать подписчиков и базы данных подписок.
Указать имена входов и пароли, используемые агентами репликации для подключений:
Для подписок на публикации моментальных снимков и публикации транзакций укажите учетные данные на странице Безопасность агента распространителя .
Для подписок на публикации слияния укажите учетные данные на странице Безопасность агента слияния.
Дополнительные сведения о разрешениях, необходимых каждому агенту, см. в разделе Модель безопасности агента репликации.
Указать расписание синхронизации и время, когда подписчик должен быть инициализирован.
Укажите дополнительные параметры для публикаций слияния: тип подписки; значения параметризованного фильтра; и сведения для синхронизации по протоколу HTTPS, если для публикации включена веб-синхронизация.
Укажите дополнительные параметры для транзакционных публикаций, поддерживающих обновляемые подписки: должны ли подписчики немедленно фиксировать изменения у издателя или записывать их в очередь; учетные данные, используемые для подключения подписчика к издателю.
При необходимости создайте скрипт для подписки.
Создание подписки по запросу с издателя
Подключитесь к издателю в Microsoft SQL Server Management Studio, а затем разверните узел сервера.
Раскройте папку Репликация , а затем папку Локальные публикации .
Щелкните правой кнопкой мыши публикацию, для которой хотите создать одну или более подписок, затем щелкните Создать подписку.
Заполните страницы мастера создания новой подписки.
Создание подписки по запросу с подписчика
Подключитесь к подписчику в SQL Server Management Studio, затем разверните узел сервера.
Раскройте папку Репликация .
Щелкните правой кнопкой мыши папку Локальные подписки , затем щелкните Создать подписку.
На странице публикации нового мастера подписки выберите <«Найти SQL Server Publisher>» или <«Найти Oracle Publisher>» из выпадающего списка Publisher.
Соединитесь с издателем в диалоговом окне Соединение с сервером .
Выберите публикацию на странице Публикация .
Заполните страницы мастера создания новой подписки.
Использование Transact-SQL
Подписки по запросу можно создавать программно с помощью хранимых процедур репликации. Какие именно хранимые процедуры будут при этом применяться, зависит от типа публикации, к которой относится подписка.
Создание подписки по запросу на публикацию моментальных снимков или транзакций
На издателе убедитесь, что публикация поддерживает подписки на вытягивание, выполнив sp_helppublication (Transact-SQL).
Если значение allow_pull в результирующем наборе равно 1, то публикация поддерживает подписки по запросу.
Если значение allow_pull равно 0, выполните sp_changepublication (Transact-SQL), указав allow_pull для @property и true для @value.
На подписчике выполните sp_addpullsubscription (Transact-SQL). Укажите значения параметров @publisher и @publication. Сведения об обновлении подписок см. в разделе Создание обновляемых подписок для публикаций транзакций.
На подписчике выполните sp_addpullsubscription_agent (Transact-SQL). Укажите следующие данные:
Параметры @publisher, @publisher_db и @publication.
Учетные данные Microsoft Windows, от имени которых агент распространения выполняется на подписчике для @job_login и @job_password.
Примечание.
Для соединений, производимых с использованием встроенной проверки подлинности Windows, в параметрах @job_login и @job_passwordвсегда указываются учетные данные Windows. Агент распространителя всегда создает локальное соединение с подписчиком с использованием встроенной проверки подлинности Windows. По умолчанию агент установит соединение с распространителем с помощью встроенной проверки подлинности Windows.
(Необязательно) Значение 0 для @distributor_security_mode и сведения для входа в SQL Server для @distributor_login и @distributor_password, если необходимо использовать проверку подлинности SQL Server при подключении к распространителю.
Расписание задания агента распространителя для этой подписки. Дополнительные сведения см. в статье Specify Synchronization Schedules.
На издателе выполните sp_addsubscription (Transact-SQL), чтобы зарегистрировать подписку по запросу. Укажите значения параметров @publication, @subscriberи @destination_db. В качестве значения параметра @subscription_type укажите pull.
Создание подписки по запросу для публикации слияния
На издателе убедитесь, что публикация поддерживает подписки на вытягивание, выполнив sp_helpmergepublication (Transact-SQL).
Если значение allow_pull в результирующем наборе равно 1, то публикация поддерживает подписки по запросу.
Если значение allow_pull равно 0, выполните sp_changemergepublication (Transact-SQL), указав allow_pull для @property и true для @value.
На подписчике выполните sp_addmergepullsubscription (Transact-SQL). Укажите значения параметров @publisher, @publisher_db, @publication, а также следующих:
@subscriber_type — укажите локальную подписку клиента и глобальную для подписки сервера.
@subscription_priority. Укажите приоритет подписки (0.00 до 99.99). Это значение необходимо указывать только для серверной подписки.
Дополнительные сведения см. в разделе Расширенное обнаружение и разрешение конфликтов при репликации слиянием.
На подписчике выполните sp_addmergepullsubscription_agent (Transact-SQL). Укажите следующие параметры:
@publisher, @publisher_dbи @publication.
учетные данные пользователя Windows, от имени которого на подписчике будет запущен агент слияния, в качестве значений параметров @job_login и @job_password;
Примечание.
Для соединений, производимых с использованием встроенной проверки подлинности Windows, в параметрах @job_login и @job_passwordвсегда указываются учетные данные Windows. Агент слияния всегда создает локальное соединение с подписчиком с использованием встроенной проверки подлинности Windows. По умолчанию агент установит соединение с распространителем и издателем с помощью встроенной проверки подлинности Windows.
(Необязательно) Значение 0 для @distributor_security_mode и учетные данные для входа в SQL Server для @distributor_login и @distributor_password, если необходимо использовать проверку подлинности SQL Server при подключении к распространителю.
(Необязательно) Значение 0 для @publisher_security_mode и учетные данные для входа SQL Server для @publisher_login и @publisher_password, если необходимо использовать проверку подлинности SQL Server при подключении к издателю.
Расписание задания агента слияния для этой подписки. Дополнительные сведения см. в разделе Создание обновляемых подписок для публикаций транзакций.
На издателе выполните sp_addmergesubscription (Transact-SQL). Укажите значения параметров @publication, @subscriber, @subscriber_dbи значение pull в параметре @subscription_type. Это регистрирует подписку по запросу.
Примеры (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 @publisher AS sysname;
DECLARE @publicationDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks';
-- At the subscription database, create a pull subscription
-- to a transactional publication.
USE [AdventureWorksReplica]
EXEC sp_addpullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addpullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password);
GO
-- 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 Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorksReplica';
-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addsubscription
@publication = @publication,
@subscriber = @subscriber,
@destination_db = @subscriptionDB,
@subscription_type = N'pull',
@status = N'subscribed';
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".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks';
SET @hostname = N'adventure-works\david8';
-- At the subscription database, create a pull subscription
-- to a merge publication.
USE [AdventureWorksReplica]
EXEC sp_addmergepullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addmergepullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password),
@hostname = @hostname;
GO
-- Execute this batch at the Publisher.
DECLARE @myMergePub AS sysname;
DECLARE @mySub AS sysname;
DECLARE @mySubDB AS sysname;
SET @myMergePub = N'AdvWorksSalesOrdersMerge';
SET @mySub = N'MYSUBSERVER';
SET @mySubDB = N'AdventureWorksReplica';
-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks]
EXEC sp_addmergesubscription @publication = @myMergePub,
@subscriber = @mySub, @subscriber_db = @mySubDB,
@subscription_type = N'pull';
GO
Использование объектов управления репликацией (RMO)
Классы RMO, используемые для создания подписки на вытягивание, зависят от типа публикации, к которой относится подписка.
Создание подписки по запросу на публикацию моментальных снимков или транзакций
Создайте соединения с подписчиком и издателем с помощью класса ServerConnection .
На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса TransPublication . Задайте свойства Name, DatabaseName и ConnectionContext.
Вызовите метод LoadProperties . Если метод возвращает значение false, то либо неверно определены свойства, указанные на шаге 2, либо публикация не существует на сервере.
Выполните побитовое логическое И (& в Visual C# и And в Visual Basic) между свойством и . Если результат равен None, присвойте свойству Attributes результат операции «поразрядное логическое ИЛИ» (| в Visual C# и Or в Visual Basic) над свойством Attributes и AllowPull. Затем вызовите метод CommitPropertyChanges , чтобы включить подписку по запросу.
Если база данных подписки не существует, создайте ее с помощью класса Database . Дополнительные сведения см. в статье Creating, Altering, and Removing Databases (Создание, изменение и удаление баз данных).
Создайте экземпляр класса TransPullSubscription.
Укажите следующие свойства подписки:
ServerConnection для подписчика, созданного на шаге 1, для ConnectionContext.
Имя базы данных подписки для DatabaseName.
Имя издателя для PublisherName.
Имя базы данных публикаций для PublicationDBName.
Название публикации для PublicationName.
Поля Login и Password в SynchronizationAgentProcessSecurity используются для указания учетных данных учетной записи Microsoft Windows, от имени которой агент распространения запускается на Подписчике. Эта учетная запись будет использоваться для создания локальных соединений с подписчиком, а также для удаленных соединений с использованием проверки подлинности Windows.
Примечание.
Указывать свойство SynchronizationAgentProcessSecurity необязательно, если подписка создается членом предопределенной роли сервера sysadmin , однако рекомендуется это сделать. В этом случае агент будет работать от имени учетной записи агент SQL Server. Дополнительные сведения см. в статье Replication Agent Security Model.
(Необязательно) Значение true для параметра CreateSyncAgentByDefault, чтобы создать задание агента для синхронизации подписки. Если указано значение false (значение по умолчанию), подписку можно синхронизировать только программно, и поэтому придется указывать дополнительные свойства TransSynchronizationAgent при доступе к этому объекту из SynchronizationAgent . Дополнительные сведения см. в статье Synchronize a Pull Subscription.
Примечание.
агент SQL Server доступен не во всех редакциях SQL Server. Если для Express Subscribers указано значение true, задание агента не создаётся. Однако важные метаданные, связанные с подпиской, хранятся у подписчика. Список функций, поддерживаемых редакциями SQL Server, см. раздел Редакции и поддерживаемые функции SQL Server 2025.
(Необязательно) При подключении к распространителю с использованием проверки подлинности SQL Server задайте значения полей SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword объекта DistributorSecurity.
Вызовите метод Create .
Используя экземпляр класса TransPublication из шага 2, вызовите метод MakePullSubscriptionWellKnown, чтобы зарегистрировать pull-подписку в Publisher. Если данная регистрация уже существует, возникнет исключение.
Создать подписку по запросу для публикации слияния
Создайте соединения с подписчиком и издателем с помощью класса ServerConnection .
На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса MergePublication . Задайте свойства Name, DatabaseNameи ConnectionContext.
Вызовите метод LoadProperties . Если метод возвращает значение false, то либо неверно определены свойства, указанные на шаге 2, либо публикация не существует на сервере.
Выполните побитовое логическое И (& в Visual C# и And в Visual Basic) между свойством и . Если результат равен None, присвойте свойству Attributes результат операции «поразрядное логическое ИЛИ» (| в Visual C# и Or в Visual Basic) над свойством Attributes и AllowPull. Затем вызовите метод CommitPropertyChanges , чтобы включить подписку по запросу.
Если база данных подписки не существует, создайте ее с помощью класса Database . Дополнительные сведения см. в статье Creating, Altering, and Removing Databases (Создание, изменение и удаление баз данных).
Создайте экземпляр класса MergePullSubscription.
Укажите следующие свойства подписки:
ServerConnection для подписчика, созданного на шаге 1, для ConnectionContext.
Имя базы данных подписки для DatabaseName.
Название издателя для PublisherName.
Имя базы данных публикаций для PublicationDBName.
Название публикации для PublicationName.
Поля Login и Password элемента SynchronizationAgentProcessSecurity предназначены для указания учетных данных учетной записи Microsoft Windows, от имени которой запускается агент слияния на Подписчике. Эта учетная запись будет использоваться для создания локальных соединений с подписчиком, а также для удаленных соединений с использованием проверки подлинности Windows.
Примечание.
Указывать свойство SynchronizationAgentProcessSecurity необязательно, если подписка создается членом предопределенной роли сервера sysadmin , однако рекомендуется это сделать. В этом случае агент будет работать от имени учетной записи агент SQL Server. Дополнительные сведения см. в статье Replication Agent Security Model.
(Необязательно) Значение true для параметра CreateSyncAgentByDefault, чтобы создать задание агента для синхронизации подписки. Если указано значение false (значение по умолчанию), подписку можно синхронизировать только программно, и поэтому придется указывать дополнительные свойства MergeSynchronizationAgent при доступе к этому объекту из SynchronizationAgent . Дополнительные сведения см. в статье Synchronize a Pull Subscription.
(Необязательно) При подключении к распространителю с использованием проверки подлинности SQL Server задайте значения полей SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword объекта DistributorSecurity.
(Необязательно) При использовании проверки подлинности SQL Server для подключения к издателю задайте поля SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword в PublisherSecurity.
Вызовите метод Create .
Используя экземпляр класса MergePublication из шага 2, вызовите метод MakePullSubscriptionWellKnown, чтобы зарегистрировать pull-подписку в Publisher. Если данная регистрация уже существует, возникнет исключение.
Пример (RMO)
В следующем примере создается подписка по запросу на публикацию транзакций. Учетные данные учетной записи Windows, используемые для создания задания агента распространения, передаются во время выполнения.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
TransPublication publication;
TransPullSubscription subscription;
try
{
// Connect to the Publisher and Subscriber.
subscriberConn.Connect();
publisherConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new TransPublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.IsExistingObject)
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new TransPullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// By default, subscriptions to transactional publications are synchronized
// continuously, but in this case we only want to synchronize on demand.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (TransSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName)
{
registered = true;
}
}
if (!registered)
{
// Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
TransSubscriberType.ReadOnly);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksProductTran"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransPullSubscription
Try
' Connect to the Publisher and Subscriber.
subscriberConn.Connect()
publisherConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New TransPublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.IsExistingObject Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New TransPullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.Description = "Pull subscription to " + publicationDbName _
+ " on " + subscriberName + "."
' Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' By default, subscriptions to transactional publications are synchronized
' continuously, but in this case we only want to synchronize on demand.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As TransSubscription In publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName And _
existing.SubscriptionDBName = subscriptionDbName Then
registered = True
End If
Next existing
If Not registered Then
' Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
TransSubscriberType.ReadOnly)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
В следующем примере создается подписка по запросу на публикацию слиянием. Учетные данные учетной записи Windows, используемые для создания задания агента слияния, передаются во время выполнения.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
string hostname = @"adventure-works\garrett1";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
Dim hostname As String = "adventure-works\garrett1"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
В следующем примере создается подписка по запросу на публикацию слиянием без создания соответствующего задания агента и метаданных подписки в таблице MSsubscription_properties. Учетные данные учетной записи Windows, используемые при создании задания агента слияния, передаются во время выполнения.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify that an agent job not be created for this subscription. The
// subscription can only be synchronized by running the Merge Agent directly.
// Subscription metadata stored in MSsubscription_properties will not
// be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = false;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
' Specify that an agent job not be created for this subscription. The
' subscription can only be synchronized by running the Merge Agent directly.
' Subscription metadata stored in MSsubscription_properties will not
' be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = False
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
В следующем примере создается подписка по запросу на публикацию слиянием, которую можно синхронизировать через Интернет при помощи веб-синхронизации. Учетные данные учетной записи Windows, используемые для создания задания агента слияния, передаются во время выполнения. Дополнительные сведения см. в разделе Configure Web Synchronization.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions and Web synchronization.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
{
publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Enable Web synchronization.
subscription.UseWebSynchronization = true;
subscription.InternetUrl = webSyncUrl;
// Specify the same Windows credentials to use when connecting to the
// Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
subscription.InternetLogin = winLogin;
subscription.InternetPassword = winPassword;
// Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
Dim hostname As String = "adventure-works\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions and Web synchronization.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowWebSynchronization
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
subscription.CreateSyncAgentByDefault = True
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Enable Web synchronization.
subscription.UseWebSynchronization = True
subscription.InternetUrl = webSyncUrl
' Specify the same Windows credentials to use when connecting to the
' Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
subscription.InternetLogin = winLogin
subscription.InternetPassword = winPassword
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try