Como criar uma assinatura push (programação RMO)
Crie assinaturas push de forma programada, usando RMO (Replication Management Objects). As classes RMO usadas para criar uma assinatura push dependem do tipo de publicação no qual a assinatura é criada.
Observação sobre segurança |
---|
Quando possível, solicite que os usuários insiram as credenciais de segurança em tempo de execução. Se for preciso armazenar credenciais, use os serviços criptográficos fornecidos pelo Microsoft Windows .NET Framework. |
Para criar uma assinatura push em um instantâneo ou publicação transacional
Crie uma conexão com o Publicador usando a classe ServerConnection.
Crie uma instância da classe TransPublication usando a conexão com o Publicador da Etapa 1. Especifique Name, DatabaseName, e ConnectionContext.
Chame o método LoadProperties. Se esse método retornar false, as propriedades da Etapa 2 estão incorretas ou a publicação não existe no servidor.
Realize uma lógica AND de bit a bit (& no Visual C# e And no Visual Basic) entre a propriedade Attributes e AllowPush. Se o resultado for None, defina Attributes para o resultado de uma lógica OR de bit a bit (| em Visual C# e Or em Visual Basic) entre Attributes e AllowPush. Em seguida, chame CommitPropertyChanges para ativar assinaturas push.
Se não houver banco de dados de assinatura, crie-o usando a classe Database. Para obter mais informações, consulte Criando, alterando e removendo bancos de dados.
Crie uma instância da classe TransSubscription.
Defina as seguintes propriedades de assinatura:
O ServerConnection para o Publicador criado na Etapa 1 para ConnectionContext.
Nome do banco de dados de assinatura para SubscriptionDBName.
Nome do Assinante para SubscriberName.
Nome do banco de dados de publicação para DatabaseName.
Nome da publicação para PublicationName.
Os campos Login e Password ou SecurePassword de SynchronizationAgentProcessSecurity para fornecer as credenciais para a conta do Windows Microsoft em que o Distribution Agent é executado no Distribuidor. Essa conta é usada para fazer conexões locais com o Distribuidor e para fazer conexões remotas que usam a Autenticação do Windows.
Observação Não é necessário definir SynchronizationAgentProcessSecurity quando a assinatura é criada por um membro da função de servidor fixa sysadmin; no entanto, é recomendado. Nesse caso, o agente personificará a conta do SQL Server Agent. Para obter mais informações, consulte Modelo de segurança do agente de replicação.
(Opcional) Um valor de true (padrão) para CreateSyncAgentByDefault para criar um trabalho de agente que seja usado para sincronizar a assinatura. Se você especificar false, a assinatura só poderá ser sincronizada programaticamente.
(Opcional) Defina os campos SqlStandardLogin e SqlStandardPassword ou SecureSqlStandardPassword de SubscriberSecurity ao usar a Autenticação do SQL Server para conexão com o Assinante.
Chame o método Create.
Observação sobre segurança Ao criar uma assinatura push no Publicador com um Distribuidor remoto, os valores fornecidos para todas as propriedades, inclusive SynchronizationAgentProcessSecurity, são enviados para o Distribuidor como texto sem formatação. Criptografe a conexão entre o Publicador e seu Distribuidor remoto antes de executar esse método Create. Para obter mais informações, consulte Criptografando conexões com o SQL Server.
Para criar uma assinatura push para publicação de mesclagem
Crie uma conexão com o Publicador usando a classe ServerConnection.
Crie uma instância da classe MergePublication usando a conexão com o Publicador da Etapa 1. Especifique Name, DatabaseName, e ConnectionContext.
Chame o método LoadProperties. Se esse método retornar false, as propriedades da Etapa 2 estão incorretas ou a publicação não existe no servidor.
Realize uma lógica AND de bit a bit (& no Visual C# e And no Visual Basic) entre a propriedade Attributes e AllowPush. Se o resultado for None, defina Attributes para o resultado de uma lógica OR de bit a bit (| em Visual C# e Or em Visual Basic) entre Attributes e AllowPush. Em seguida, chame CommitPropertyChanges para ativar assinaturas push.
Se não houver banco de dados de assinatura, crie-o usando a classe Database. Para obter mais informações, consulte Criando, alterando e removendo bancos de dados.
Crie uma instância da classe MergeSubscription.
Defina as seguintes propriedades de assinatura:
O ServerConnection para o Publicador criado na Etapa 1 para ConnectionContext.
Nome do banco de dados de assinatura para SubscriptionDBName.
Nome do Assinante para SubscriberName.
Nome do banco de dados de publicação para DatabaseName.
Nome da publicação para PublicationName.
Os campos Login e Password ou SecurePassword de SynchronizationAgentProcessSecurity para fornecer as credenciais para a conta do Windows Microsoft na qual o Merge Agent é executado no Distribuidor. Essa conta é usada para fazer conexões locais com o Distribuidor e para fazer conexões remotas que usam a Autenticação do Windows.
Observação Não é necessário definir SynchronizationAgentProcessSecurity quando a assinatura for criada por um membro da função de servidor fixa sysadmin; no entanto, é recomendado. Nesse caso, o agente personificará a conta do SQL Server Agent. Para obter mais informações, consulte Modelo de segurança do agente de replicação.
(Opcional) Um valor de true (padrão) para CreateSyncAgentByDefault para criar um trabalho de agente que seja usado para sincronizar a assinatura. Se você especificar false, a assinatura só poderá ser sincronizada programaticamente.
(Opcional) Defina os campos SqlStandardLogin e SqlStandardPassword ou SecureSqlStandardPassword de SubscriberSecurity ao usar a Autenticação do SQL Server para conexão com o Assinante.
(Opcional) Defina os campos SqlStandardLogin e SqlStandardPassword ou SecureSqlStandardPassword de PublisherSecurity ao usar a Autenticação do SQL Server para conexão com o Publicador.
Chame o método Create.
Observação sobre segurança Ao criar uma assinatura push no Publicador com um Distribuidor remoto, os valores fornecidos para todas as propriedades, inclusive SynchronizationAgentProcessSecurity, são enviados para o Distribuidor como texto sem formatação. Criptografe a conexão entre o Publicador e seu Distribuidor remoto antes de executar o método Create. Para obter mais informações, consulte Criptografando conexões com o SQL Server.
Exemplo
Esse exemplo cria uma nova assinatura push para uma publicação transacional. As credenciais da conta do Windows usadas para executar o trabalho do Distribution Agent são passadas em tempo de execução.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
//Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(subscriberName);
// Create the objects that we need.
TransPublication publication;
TransSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Ensure that the publication exists and that
// it supports push subscriptions.
publication = new TransPublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = conn;
if (publication.IsExistingObject)
{
if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPush;
}
// Define the push subscription.
subscription = new TransSubscription();
subscription.ConnectionContext = conn;
subscription.SubscriberName = subscriberName;
subscription.PublicationName = publicationName;
subscription.DatabaseName = publicationDbName;
subscription.SubscriptionDBName = subscriptionDbName;
// Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// 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 push subscription.
subscription.Create();
}
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
{
conn.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 a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Ensure that the publication exists and that
' it supports push subscriptions.
publication = New TransPublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = conn
If publication.IsExistingObject Then
If (publication.Attributes And PublicationAttributes.AllowPush) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPush
End If
' Define the push subscription.
subscription = New TransSubscription()
subscription.ConnectionContext = conn
subscription.SubscriberName = subscriberName
subscription.PublicationName = publicationName
subscription.DatabaseName = publicationDbName
subscription.SubscriptionDBName = subscriptionDbName
' Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' 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 push subscription.
subscription.Create()
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
conn.Disconnect()
End Try
Esse exemplo cria uma nova assinatura push para uma publicação de mesclagem. As credenciais da conta do Windows usadas para executar o trabalho do Merge Agent são passadas em tempo de execução.
// 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 a connection to the Publisher.
ServerConnection conn = new ServerConnection(subscriberName);
// Create the objects that we need.
MergePublication publication;
MergeSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Ensure that the publication exists and that
// it supports push subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = conn;
if (publication.IsExistingObject)
{
if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPush;
}
// Define the push subscription.
subscription = new MergeSubscription();
subscription.ConnectionContext = conn;
subscription.SubscriberName = subscriberName;
subscription.PublicationName = publicationName;
subscription.DatabaseName = publicationDbName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.HostName = hostname;
// Set a schedule to synchronize the subscription every 2 hours
// during weekdays from 6am to 10pm.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Weekly;
subscription.AgentSchedule.FrequencyInterval = Convert.ToInt32(0x003E);
subscription.AgentSchedule.FrequencyRecurrenceFactor = 1;
subscription.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour;
subscription.AgentSchedule.FrequencySubDayInterval = 2;
subscription.AgentSchedule.ActiveStartDate = 20051108;
subscription.AgentSchedule.ActiveEndDate = 20071231;
subscription.AgentSchedule.ActiveStartTime = 060000;
subscription.AgentSchedule.ActiveEndTime = 100000;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Create the push subscription.
subscription.Create();
}
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
{
conn.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 a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergeSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Ensure that the publication exists and that
' it supports push subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = conn
If publication.IsExistingObject Then
If (publication.Attributes And PublicationAttributes.AllowPush) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPush
End If
' Define the push subscription.
subscription = New MergeSubscription()
subscription.ConnectionContext = conn
subscription.SubscriberName = subscriberName
subscription.PublicationName = publicationName
subscription.DatabaseName = publicationDbName
subscription.SubscriptionDBName = subscriptionDbName
subscription.HostName = hostname
' Set a schedule to synchronize the subscription every 2 hours
' during weekdays from 6am to 10pm.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Weekly
subscription.AgentSchedule.FrequencyInterval = Convert.ToInt32("0x003E", 16)
subscription.AgentSchedule.FrequencyRecurrenceFactor = 1
subscription.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour
subscription.AgentSchedule.FrequencySubDayInterval = 2
subscription.AgentSchedule.ActiveStartDate = 20051108
subscription.AgentSchedule.ActiveEndDate = 20071231
subscription.AgentSchedule.ActiveStartTime = 60000
subscription.AgentSchedule.ActiveEndTime = 100000
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Create the push subscription.
subscription.Create()
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
conn.Disconnect()
End Try