Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve como criar uma assinatura pull no SQL Server 2014 usando o SQL Server Management Studio, o Transact-SQL ou o RMO (Replication Management Objects).
A configuração de uma assinatura pull para replicação P2P é possível por meio de script, mas não está disponível através do assistente.
Como usar o SQL Server Management Studio.
Crie uma assinatura pull no Publicador ou no Assinante usando o Assistente para Nova Assinatura. Siga o passo a passo do assistente para:
Especifique o Publicador e a publicação.
Selecione onde os agentes de replicação serão executados. Para obter uma assinatura pull, selecione Executar cada agente em seu Assinante (assinaturas pull) na página Local do Agente de Distribuição ou na página Local do Agente de Mesclagem , dependendo do tipo de publicação.
Especifique assinantes e bancos de dados de assinatura.
Especifique os logons e senhas usados para conexões feitas por agentes de replicação:
Para assinaturas de instantâneo e publicações transacionais, especifique as credenciais na página Segurança do Agente de Distribuição .
Para assinaturas para mesclar publicações, especifique as credenciais na página Segurança do Agente de Mesclagem .
Para obter informações sobre as permissões exigidas por cada agente, consulte Replication Agent Security Model.
Especifique um agendamento de sincronização e quando o Assinante deverá ser inicializado.
Especificar opções adicionais para publicações de mesclagem: tipo de assinatura; valores para filtragem parametrizada; e informações para sincronização por meio de HTTPS se a publicação estiver habilitada para sincronização da Web.
Especifique opções adicionais para publicações transacionais que permitem a atualização de assinaturas: se os Assinantes devem confirmar alterações no Publicador imediatamente ou gravá-las em uma fila; credenciais usadas para se conectar do Assinante ao Publicador.
Opcionalmente, faça o script da assinatura.
Para criar uma assinatura pull do Publicador
Conecte-se ao Publicador no Microsoft SQL Server Management Studio e, em seguida, expanda o nó do servidor.
Expanda a pasta Replicação e expanda a pasta Publicações Locais .
Clique com o botão direito do mouse na publicação para a qual você deseja criar uma ou mais assinaturas e clique em Novas Assinaturas.
Preencha as páginas no Assistente para Nova Assinatura.
Para criar uma assinatura pull a partir do Assinante
Conecte-se ao Assinante no SQL Server Management Studio, e expanda o nó do servidor.
Expanda a pasta Replicação .
Clique com o botão direito do mouse na pasta Assinaturas Locais e clique em Novas Assinaturas.
Na página Publicação do Assistente para Nova Assinatura, selecione <Localizar Publicador do SQL Server> ou <Localizar Publicador Oracle> na lista suspensa Publicador.
Conecte-se ao Publicador na caixa de diálogo Conectar ao Servidor .
Selecione uma publicação na página Publicação .
Conclua as páginas no Assistente para Nova Assinatura.
Usando Transact-SQL
As assinaturas pull podem ser criadas programaticamente usando procedimentos armazenados de replicação. Os procedimentos armazenados usados dependerão do tipo de publicação ao qual a assinatura pertence.
Para criar uma assinatura pull para uma publicação de instantâneo ou transacional
No Publicador, verifique se a publicação dá suporte a assinaturas de pull executando sp_helppublication (Transact-SQL).
Se o valor de allow_pull no conjunto de resultados for 1, a publicação oferecerá suporte a assinaturas pull.
Se o valor de allow_pull for 0, execute sp_changepublication (Transact-SQL), especificando allow_pull para @property e
truepara @value.
No sistema de assinatura, execute sp_addpullsubscription (Transact-SQL). Especifique @publisher e @publication. Para obter informações sobre como atualizar assinaturas, consulte Criar uma assinatura atualizável para uma publicação transacional.
No Assinante, execute sp_addpullsubscription_agent (Transact-SQL). Especifique o seguinte:
Os parâmetros @publisher, @publisher_db e @publication .
As credenciais do Microsoft Windows usadas para executar o Agente de Distribuição no Assinante para @job_login e @job_password.
Observação
As conexões feitas usando a Autenticação Integrada do Windows sempre usam as credenciais do Windows especificadas por @job_login e @job_password. O Agente de Distribuição sempre faz a conexão local com o Assinante usando a Autenticação Integrada do Windows. Por padrão, o agente se conectará ao Distribuidor usando a Autenticação Integrada do Windows.
(Opcional) Um valor 0 para @distributor_security_mode e as informações de logon do Microsoft SQL Server para @distributor_login e @distributor_password, se precisar usar a Autenticação do SQL Server ao se conectar ao Distribuidor.
Um agendamento para o trabalho do Agente de Distribuição para esta assinatura. Para obter mais informações, consulte Especificar Agendamentos de Sincronização.
No Publicador, execute sp_addsubscription (Transact-SQL) para registrar a assinatura por pull. Especifique @publication, @subscriber e @destination_db. Especifique um valor de pull para @subscription_type.
Para criar uma assinatura pull para uma publicação de mesclagem
No Publicador, verifique se a publicação dá suporte a assinaturas pull executando sp_helpmergepublication (Transact-SQL).
Se o valor de allow_pull no conjunto de resultados for 1, a publicação oferecerá suporte a assinaturas pull.
Se o valor de allow_pull for 0, execute sp_changemergepublication (Transact-SQL), especificando allow_pull para @property e
truepara @value.
No Assinante, execute sp_addmergepullsubscription (Transact-SQL). Especifique @publisher, @publisher_db, @publication e os seguintes parâmetros:
@subscriber_type - especifique local para uma assinatura de cliente e global para uma assinatura de servidor.
@subscription_priority – especifique uma prioridade para a assinatura (0,00 a 99,99). Isso só é necessário para uma assinatura de servidor.
Para obter mais informações, consulte Detecção e resolução de conflitos de replicação de mesclagem avançada.
No Assinante, execute sp_addmergepullsubscription_agent (Transact-SQL). Especifique os seguintes parâmetros:
@publisher, @publisher_db e @publication.
As credenciais do Windows em que o Agente de Mesclagem é executado no Assinante para @job_login e @job_password.
Observação
As conexões feitas usando a Autenticação Integrada do Windows sempre usam as credenciais do Windows especificadas por @job_login e @job_password. O Merge Agent sempre faz a conexão local com o Assinante usando a Autenticação Integrada do Windows. Por padrão, o agente se conectará ao Distribuidor e ao Publicador usando a Autenticação Integrada do Windows.
(Opcional) Um valor 0 para @distributor_security_mode e as informações de logon do SQL Server para @distributor_login e @distributor_password, se precisar usar a Autenticação do SQL Server ao se conectar ao Distribuidor.
(Opcional) Um valor 0 para @publisher_security_mode e as informações de logon do SQL Server para @publisher_login e @publisher_password, se precisar usar a Autenticação do SQL Server ao se conectar ao Publicador.
Um agendamento para o trabalho do Merge Agent para esta assinatura. Para obter mais informações, consulte Criar uma assinatura atualizável para uma publicação transacional.
No Publicador, execute sp_addmergesubscription (Transact-SQL). Especifique @publication, @subscriber, @subscriber_db e um valor de pull para @subscription_type. Isso registra a assinatura pull.
Exemplos (Transact-SQL)
O exemplo a seguir cria uma assinatura pull para uma publicação transacional. O primeiro lote é executado no Assinante e o segundo lote é executado no Publicador. Os valores de logon e senha são fornecidos em runtime usando variáveis de script 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'AdventureWorks2012';
-- At the subscription database, create a pull subscription
-- to a transactional publication.
USE [AdventureWorks2012Replica]
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'AdventureWorks2012Replica';
-- 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
O exemplo a seguir cria uma assinatura pull para uma publicação de mesclagem. O primeiro lote é executado no Assinante e o segundo lote é executado no Publicador. Os valores de logon e senha são fornecidos em tempo de execução usando variáveis de script 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'AdventureWorks2012';
SET @hostname = N'adventure-works\david8';
-- At the subscription database, create a pull subscription
-- to a merge publication.
USE [AdventureWorks2012Replica]
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'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2012]
EXEC sp_addmergesubscription @publication = @myMergePub,
@subscriber = @mySub, @subscriber_db = @mySubDB,
@subscription_type = N'pull';
GO
Usando Objetos de Gerenciamento de Replicação (RMO)
As classes RMO usadas para criar uma assinatura pull dependem do tipo de publicação à qual a assinatura pertence.
Para criar uma assinatura pull para um instantâneo ou publicação transacional
Crie conexões com o Assinante e o Publicador usando a ServerConnection Classe.
Crie uma instância da TransPublication classe usando a conexão do Publicador da etapa 1. Especifique Name, DatabaseName e ConnectionContext.
Chame o método LoadProperties . Se esse método retornar
false, as propriedades especificadas na etapa 2 estarão incorretas ou a publicação não existirá no servidor.Execute um AND lógico bit a bit (
&no Visual C# eAndno Visual Basic) entre a propriedade Attributes e AllowPull. Se o resultado for None, defina Attributes como o resultado de um OR lógico bit a bit (|no Visual C# eOrno Visual Basic) entre Attributes e AllowPull. Em seguida, chame a função CommitPropertyChanges para habilitar assinaturas pull.Se o banco de dados de assinatura não existir, crie-o usando a Database classe. Para obter mais informações, consulte Criando, alterando e removendo bancos de dados.
Criar uma instância da classe TransPullSubscription.
Defina as seguintes propriedades de assinatura:
O ServerConnection criado na etapa 1 para o Assinante ConnectionContext.
Nome do banco de dados de assinatura para DatabaseName.
Nome do Publicador para PublisherName.
Nome do banco de dados de publicação para PublicationDBName.
Nome da publicação para PublicationName.
Os campos Login e Password ou SecurePassword* de SynchronizationAgentProcessSecurity fornecem as credenciais para a conta do Microsoft Windows sob a qual o Agente de Distribuição é executado no Assinante. Essa conta é usada para fazer conexões locais com o Assinante e para fazer conexões remotas usando a Autenticação do Windows.
Observação
A configuração SynchronizationAgentProcessSecurity não é necessária quando a assinatura é criada por um membro que possui a função fixa de servidor
sysadmin, no entanto, é recomendável. Nesse caso, o agente representará a conta do SQL Server Agent. Para obter mais informações, consulte Replication Agent Security Model.(Opcional) Um valor de
truepara CreateSyncAgentByDefault criar uma tarefa de agente usada para sincronizar a assinatura. Se você especificarfalse(o padrão), a assinatura só poderá ser sincronizada programaticamente e você deverá especificar propriedades adicionais de TransSynchronizationAgent quando acessar esse objeto da SynchronizationAgent propriedade. Para obter mais informações, consulte Synchronize a Pull Subscription.Observação
O SQL Server Agent não está disponível em todas as edições do MicrosoftSQL Server. Para obter uma lista de recursos compatíveis com as edições do SQL Server, consulte recursos compatíveis com as edições do SQL Server 2014. Ao especificar um valor de
truepara Assinantes Expressos, o trabalho do agente não é criado. No entanto, metadados importantes relacionados à assinatura são armazenados no Assinante.(Opcional) Defina os campos SqlStandardLogin e SqlStandardPassword, ou SecureSqlStandardPassword, de DistributorSecurity quando usar a Autenticação do SQL Server para se conectar ao Distribuidor.
Chame o método Create .
Usando a instância da classe TransPublication da etapa 2, chame o método MakePullSubscriptionWellKnown para registrar a assinatura pull com o Publicador. Se esse registro já existir, ocorrerá uma exceção.
Para criar uma assinatura pull para uma publicação de mesclagem
Crie conexões com o Assinante e o Publicador usando a ServerConnection classe.
Crie uma instância da MergePublication classe usando a conexão do Publicador da etapa 1. Especificar Name, DatabaseNamee ConnectionContext.
Chame o método LoadProperties . Se esse método retornar
false, as propriedades especificadas na etapa 2 estarão incorretas ou a publicação não existirá no servidor.Execute uma operação lógica AND bit a bit (
&no Visual C# eAndno Visual Basic) entre a propriedade Attributes e AllowPull. Se o resultado for None, defina Attributes como o resultado de um OR lógico bit a bit (|no Visual C# eOrno Visual Basic) entre Attributes e AllowPull. Em seguida, chame CommitPropertyChanges para habilitar assinaturas pull.Se o banco de dados de assinatura não existir, crie-o usando a Database classe. Para obter mais informações, consulte Criando, alterando e removendo bancos de dados.
Criar uma instância da classe MergePullSubscription.
Defina as seguintes propriedades de assinatura:
O ServerConnection do assinante criado na etapa 1 para o ConnectionContext.
Nome do banco de dados de assinatura para DatabaseName.
Nome do Publicador para PublisherName.
Nome do banco de dados de publicação para PublicationDBName.
Nome da publicação para PublicationName.
Os campos Login, Password ou SecurePassword* de SynchronizationAgentProcessSecurity fornecem as credenciais para a conta do Microsoft Windows sob a qual o Merge Agent é executado no Assinante. Essa conta é usada para fazer conexões locais com o Assinante e para fazer conexões remotas usando a Autenticação do Windows.
Observação
A configuração SynchronizationAgentProcessSecurity não é necessária quando a assinatura é criada por um membro da
sysadminfunção de servidor fixa, no entanto, é recomendável. Nesse caso, o agente representará a conta do SQL Server Agent. Para obter mais informações, consulte Replication Agent Security Model.(Opcional) Um valor de
truepara CreateSyncAgentByDefault criar um trabalho de agente que é usado para sincronizar a assinatura. Se você especificarfalse(o padrão), a assinatura só poderá ser sincronizada programaticamente e você deverá especificar propriedades adicionais de MergeSynchronizationAgent quando acessar esse objeto da SynchronizationAgent propriedade. Para obter mais informações, consulte Synchronize a Pull Subscription.(Opcional) Defina os campos SqlStandardLogin e SqlStandardPassword ou SecureSqlStandardPassword de DistributorSecurity ao usar a Autenticação do SQL Server para se conectar ao Distribuidor.
(Opcional) Defina os campos SqlStandardLogin e SqlStandardPassword ou SecureSqlStandardPassword de PublisherSecurity ao usar a Autenticação do SQL Server para se conectar ao Publicador.
Chame o método Create .
Usando a instância da MergePublication classe da etapa 2, chame o MakePullSubscriptionWellKnown método para registrar a assinatura pull com o Publicador. Se esse registro já existir, ocorrerá uma exceção.
Exemplo (RMO)
Este exemplo cria uma assinatura pull para uma publicação transacional. As credenciais da conta do Microsoft Windows usadas para criar o trabalho do Agente de Distribuição são passadas em runtime.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'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
Este exemplo cria uma assinatura pull para uma publicação de mesclagem. As credenciais da conta do Windows usadas para criar o trabalho do Merge Agent são passadas em runtime.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
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
Este exemplo cria uma assinatura pull para uma publicação de mesclagem sem criar um trabalho de agente associado ou metadados de assinatura em MSsubscription_properties. As credenciais da conta do Windows usadas para criar o trabalho do Merge Agent são passadas em runtime.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//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.
// Subscripition 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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'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.
' Subscripition 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
Este exemplo cria uma assinatura pull para uma publicação de mesclagem que pode ser sincronizada pela Internet usando sincronização via Web. As credenciais da conta do Windows usadas para criar o trabalho do Merge Agent são passadas em runtime. Para obter mais informações, consulte Configurar a Sincronização da Web.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
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
Consulte Também
Conceitos de Objetos de Gerenciamento de Replicação
Exibir e Modificar Propriedades de Assinatura Pull
Configurar a Sincronização da Web
Assinar publicações
Práticas recomendadas de segurança de replicação