Partilhar via


Crie uma subscrição push

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

Este tópico descreve como criar uma subscrição push no SQL Server utilizando SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO). Para informações sobre como criar uma subscrição push para um Assinante que não seja SQL Server, veja Criar uma subscrição para um Assinante que não seja SQL Server.

Observação

A Instância Gerenciada SQL do Azure pode ser um editor, distribuidor e assinante para replicação de instantâneo e transacional. Os bancos de dados no Banco de Dados SQL do Azure só podem ser assinantes por push para replicação de instantâneo e transacional. Para obter mais informações, consulte Replicação transacional com o Banco de Dados SQL do Azure e a Instância Gerenciada SQL do Azure.

Usando o SQL Server Management Studio

Crie uma subscrição push no Publisher ou no Subscriber utilizando o Novo Assistente de Subscrição. Siga as páginas do feiticeiro para:

  • Especifique o editor e a publicação.

  • Selecione onde os agentes de replicação irão correr. Para uma subscrição push, selecione Executar todos os agentes no Distribuidor (subscrições push) na Localização do Agente de Distribuição ou na página de Localização do Agente de Fusão, dependendo do tipo de publicação.

  • Especifique Subscritores e bases de dados de subscrição.

  • Especifique os logins e palavras-passe usados para as ligações feitas pelos agentes de replicação:

    • Para subscrições às publicações snapshot e transacionais, especifique as credenciais na página de Segurança do Agente de Distribuição.

    • Para subscrições de publicações de fusão, especifique credenciais na página de Segurança do Agente de Fusão .

      Para informações sobre as permissões que cada agente necessita, veja Modelo de segurança do agente de replicação.

  • Especifique um calendário de sincronização e quando o Assinante deve ser inicializado.

  • Especifique opções adicionais para publicações de fusão: tipo de subscrição e valores para filtragem parametrizada.

  • Especifique opções adicionais para publicações transacionais que permitam atualizar subscrições. Uma opção é decidir se os Assinantes devem aplicar as alterações imediatamente no Publicador ou escrevê-las numa fila. Outra opção é configurar credenciais usadas para conectar do Assinante ao Editor.

  • Opcionalmente, crie um script para a subscrição.

Para criar uma subscrição push a partir do Publicador

  1. Liga-te ao Publisher no Microsoft SQL Server Management Studio e depois expande o nó do servidor.

  2. Expanda a pasta Replicação e depois expanda a pasta Publicações Locais .

  3. Clique com o botão direito na publicação para a qual pretende criar uma ou mais subscrições e depois selecione Novas Subscrições.

  4. Complete as páginas no Assistente de Nova Subscrição.

Para criar uma subscrição push a partir do Assinante

  1. Liga-te ao Assinante no SQL Server Management Studio e, em seguida, expande o nó do servidor.

  2. Expande a pasta de Replicação .

  3. Clique com o botão direito na pasta Local Subscriptions e depois selecione Novas Subscrições.

  4. Na página Publicação do Assistente de Nova Subscrição, selecione <Encontrar Publicador SQL Server> ou <Encontrar Publicador Oracle> na lista suspensa Publicador.

  5. Liga-te ao Publisher na caixa de diálogo Ligar ao Servidor .

  6. Selecione uma publicação na página de Publicação .

  7. Complete as páginas no Assistente de Nova Subscrição.

Usando Transact-SQL

Pode criar subscrições push programaticamente usando procedimentos armazenados de replicação. Os procedimentos armazenados utilizados dependerão do tipo de publicação a que pertence a subscrição.

Importante

Quando possível, solicite que os usuários insiram credenciais de segurança em tempo de execução. Se você precisar armazenar credenciais em um arquivo de script, deverá proteger o arquivo para impedir o acesso não autorizado.

Para criar uma subscrição push para uma publicação de snapshot ou transacional

  1. No Editor da base de dados de publicações, verifique se a publicação suporta subscrições push ao executar sp_helppublication.

    • Se o valor de allow_push for 1, são suportadas subscrições push.

    • Se o valor de allow_push for 0, execute sp_changepublication. Especifique allow_push para @property e true para @value.

  2. No Servidor de Publicação, na base de dados de publicações, execute sp_addsubscription. Especifique @publication, @subscriber e @destination_db. Especifique um valor de push para @subscription_type. Para informações sobre como atualizar subscrições, consulte Criar uma subscrição atualizável para uma publicação transacional.

  3. No Publicador, na base de dados de publicações, execute sp_addpushsubscription_agent. Especifique o seguinte:

    • Os parâmetros @subscriber, @subscriber_db e @publication .

    • As credenciais Microsoft Windows com as quais o Agente de Distribuição executa no Distribuidor para @job_login e @job_password.

      Observação

      As ligações feitas através da Autenticação Integrada do Windows utilizam sempre as credenciais do Windows especificadas por @job_login e @job_password. O Agente de Distribuição faz sempre a ligação local ao Distribuidor usando a Autenticação Integrada do Windows. Por defeito, o agente liga-se ao Assinante usando a Autenticação Integrada do Windows.

    • (Opcional) Um valor de 0 para @subscriber_security_mode e a informação de login do Microsoft SQL Server para @subscriber_login e @subscriber_password. Especifique estes parâmetros se precisar de usar autenticação SQL Server ao ligar-se ao assinante.

    • Um calendário para o trabalho de Agente de Distribuição para esta subscrição. Para mais informações, consulte Especificar horários de sincronização.

Importante

Quando está a criar uma subscrição push num Publisher com um Distribuidor remoto, os valores fornecidos para todos os parâmetros, incluindo job_login e job_password, são enviados ao Distribuidor em texto simples. Deve encriptar a ligação entre o Publisher e o seu Distribuidor remoto antes de executar este procedimento armazenado. Para mais informações, consulte Habilitar ligações encriptadas ao motor de base de dados (SQL Server Configuration Manager).

Criar uma subscrição push para uma publicação de fusão

  1. No Publicador na base de dados da publicação, verifique se a publicação suporta subscrições push executando sp_helpmergepublication.

    • Se o valor de allow_push for 1, a publicação suporta subscrições push.

    • Se o valor de allow_push não for igual a 1, execute sp_changemergepublication. Especifique allow_push para @property e true para @value.

  2. No Publicador, na base de dados da publicação, execute sp_addmergesubscription. Especifique os parâmetros seguintes:

    • @publication. Este é o nome da publicação.

    • @subscriber_type. Para uma subscrição de cliente, especifique local. Para uma subscrição de servidor, especifique global.

    • @subscription_priority. Para uma subscrição de servidor, especifique uma prioridade para a subscrição (0,00 a 99,99).

    Para mais informações, consulte Detecção e Resolução Avançada de Conflitos de Replicação Mesclada.

  3. Na publicador na base de dados de publicações, execute sp_addmergepushsubscription_agent. Especifique o seguinte:

    • Os parâmetros @subscriber, @subscriber_db e @publication .

    • As credenciais do Windows sob as quais o Merge Agent do Distribuidor executa para @job_login e @job_password.

      Observação

      As ligações feitas através da Autenticação Integrada do Windows utilizam sempre as credenciais do Windows especificadas por @job_login e @job_password. O Merge Agent faz sempre a ligação local ao Distribuidor usando a Autenticação Integrada do Windows. Por padrão, o agente irá conectar-se ao Assinante usando a Autenticação Integrada do Windows.

    • (Opcional) Um valor de 0 para @subscriber_security_mode e a informação de login do SQL Server para @subscriber_login e @subscriber_password. Especifique estes parâmetros se precisar de usar autenticação SQL Server ao ligar-se ao assinante.

    • (Opcional) Um valor de 0 para @publisher_security_mode e a informação de login do SQL Server para @publisher_login e @publisher_password. Especifique estes valores se precisar de usar autenticação SQL Server ao ligar-se ao Publisher.

    • Um calendário para o trabalho de Merge Agent para esta subscrição. Para mais informações, consulte Especificar horários de sincronização.

Importante

Quando está a criar uma subscrição push num Publisher com um Distribuidor remoto, os valores fornecidos para todos os parâmetros, incluindo job_login e job_password, são enviados ao Distribuidor em texto simples. Deve encriptar a ligação entre o Publisher e o seu Distribuidor remoto antes de executar este procedimento armazenado. Para mais informações, consulte Habilitar ligações encriptadas ao motor de base de dados (SQL Server Configuration Manager).

Exemplos (Transact-SQL)

O exemplo seguinte cria uma subscrição push para uma publicação transacional. Os valores de login e palavra-passe são fornecidos em tempo de execução através de variáveis de scripting sqlcmd .

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables  
-- on the command line and in SQL Server Management Studio, see the 
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".

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

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

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

O exemplo seguinte cria uma subscrição push para uma publicação de fusão. Os valores de login e palavra-passe são fornecidos em tempo de execução através de variáveis de scripting sqlcmd .

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables  
-- on the command line and in SQL Server Management Studio, see the 
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".

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

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

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

Utilização de Objetos de Gestão de Replicação

Pode criar subscrições push programaticamente usando Replication Management Objects (RMO). As classes RMO que utiliza para criar uma subscrição push dependem do tipo de publicação para a qual a subscrição foi criada.

Importante

Quando possível, solicite que os usuários insiram credenciais de segurança em tempo de execução. Se tiver de armazenar credenciais, utilize os serviços criptográficos que o Microsoft Windows .NET Framework fornece.

Para criar uma subscrição push para uma publicação de snapshot ou transacional

  1. Crie uma ligação ao Editor usando a ServerConnection classe.

  2. Crie uma instância da TransPublication classe usando a ligação Publisher do passo 1. Especifique Name, DatabaseName, e ConnectionContext.

  3. Chame o método LoadProperties. Se este método devolver falso, ou as propriedades especificadas no passo 2 estão incorretas ou a publicação não existe no servidor.

  4. Execute um AND lógico bit a bit (& em Visual C# e And em Visual Basic) entre a Attributes propriedade e AllowPush. Se o resultado for None, defina Attributes para o resultado de um OR lógico bit a bit (| em Visual C# e Or em Visual Basic ) entre Attributes e AllowPush. Depois, liga CommitPropertyChanges para ativar subscrições push.

  5. Se a base de dados de subscrição não existir, crie-a usando a Database classe. Para mais informações, veja Crear, alterar e remover bases de dados.

  6. Cria uma instância da TransSubscription classe.

  7. Defina as seguintes propriedades de subscrição:

  8. Chame o método Create.

Importante

Quando está a criar uma subscrição push num Publisher com um Distribuidor remoto, os valores fornecidos para todas as propriedades, incluindo SynchronizationAgentProcessSecurity, são enviados ao Distribuidor em texto simples. Deves encriptar a ligação entre o Publisher e o seu distribuidor remoto antes de chamar o Create método. Para mais informações, consulte Habilitar ligações encriptadas ao motor de base de dados (SQL Server Configuration Manager).

Criar uma subscrição push para uma publicação de fusão

  1. Crie uma ligação ao Editor usando a ServerConnection classe.

  2. Crie uma instância da MergePublication classe usando a ligação Publisher do passo 1. Especifique Name, DatabaseName, e ConnectionContext.

  3. Chame o método LoadProperties. Se este método devolver falso, ou as propriedades especificadas no passo 2 estão incorretas ou a publicação não existe no servidor.

  4. Execute um AND lógico bit a bit (& em Visual C# e And em Visual Basic) entre a propriedade Attributes e AllowPush. Se o resultado for None, defina Attributes para o resultado de um OR lógico bit a bit (| em Visual C# e Or em Visual Basic ) entre Attributes e AllowPush. Depois, liga CommitPropertyChanges para ativar subscrições push.

  5. Se a base de dados de subscrição não existir, crie-a usando a Database classe. Para mais informações, veja Crear, alterar e remover bases de dados.

  6. Cria uma instância da MergeSubscription classe.

  7. Defina as seguintes propriedades de subscrição:

  8. Chame o método Create.

Importante

Quando está a criar uma subscrição push num Publisher com um Distribuidor remoto, os valores fornecidos para todas as propriedades, incluindo SynchronizationAgentProcessSecurity, são enviados ao Distribuidor em texto simples. Deves encriptar a ligação entre o Publisher e o seu distribuidor remoto antes de chamar o Create método. Para mais informações, consulte Habilitar ligações encriptadas ao motor de base de dados (SQL Server Configuration Manager).

Exemplos (RMO)

Este exemplo cria uma nova subscrição push para uma publicação transacional. As credenciais da conta Windows que usas para executar o trabalho do Agente de Distribuição 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 = "AdventureWorks2022Replica";
           string publicationDbName = "AdventureWorks2022";

           //Create a connection to the Publisher.
           ServerConnection conn = new ServerConnection(publisherName);

           // 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 = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

'Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

' 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

Este exemplo cria uma nova subscrição push para uma publicação de fusão. As credenciais da conta Windows que usas 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 = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";
string hostname = @"adventure-works\garrett1";

//Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

// 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 = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"
Dim hostname As String = "adventure-works\garrett1"

'Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

' 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