Conceitos de Replication Management Objects

O RMO (Replication Management Objects) é um assembly de código gerenciado que encapsula funcionalidades de replicação para o SQL Server. O RMO é implementado pelo namespace Microsoft.SqlServer.Replication.

Os tópicos das seções a seguir descrevem como você pode usar o RMO para controlar as tarefas de replicação de forma programática.

Introdução à programação RMO

O RMO é criado para a programação de todos os aspectos da replicação do SQL Server. O namespace RMO é Microsoft.SqlServer.Replication e é implementado pelo Microsoft.SqlServer.Rmo.dll, um assembly Microsoft do .NET Framework. O assembly Microsoft.SqlServer.Replication.dll, que também pertence ao namespace Microsoft.SqlServer.Replication, implementa uma interface de código gerenciado para a programação de vários agentes de replicação (Snapshot Agent, Distribution Agent e Merge Agent). Suas classes podem ser acessadas do RMO para a sincronização de assinaturas. As classes do namespace Microsoft.SqlServer.Replication.BusinessLogicSupport, implementadas pelo assembly Microsoft.SqlServer.Replication.BusinessLogicSupport.dll, são usadas na criação de lógica de negócios personalizada para replicação de mesclagem. Esse assembly é independente do RMO.

Implantando aplicativos baseados em RMO

O RMO depende dos componentes de replicação e dos componentes da conectividade de cliente incluídos em todas as versões do SQL Server, exceto no SQL Server Compact. Para implantar um aplicativo baseado em RMO, instale uma versão do SQL Server que inclua componentes da replicação e da conectividade de cliente no computador em que ele será executado.

Introdução ao RMO

Esta seção descreve como começar um projeto simples de RMO usando o Visual Studio do Microsoft.

Para criar um novo projeto do Microsoft Visual C#

  1. Inicie o Visual Studio.

  2. No menu Arquivo, clique em NovoProjeto. A caixa de diálogo Novo Projeto será exibida.

  3. Na caixa de diálogo Tipos de Projeto, selecione Projetos do Visual C#. No painel Modelos, selecione Aplicativo do Windows.

  4. (Opcional) Em Nome, digite o nome do novo aplicativo.

  5. Clique em OK para carregar o modelo do Windows do Visual C#.

  6. No menu Projeto, selecione o item Adicionar Referência. A caixa de diálogo Adicionar Referência será exibida.

  7. Selecione os assembly a seguir na lista da guia .NET e clique em OK.

    • Interface de programação .NET Microsoft.SqlServer.Replication

    • Microsoft.SqlServer.ConnectionInfo

    • Biblioteca de agentes de replicação

    ObservaçãoObservação

    Use a tecla CTRL para selecionar mais de um arquivo.

  8. (Opcional) Repita a etapa 6. Clique na guia Procurar, navegue até C:\Arquivos de Programas\Microsoft SQL Server\100\COM, selecione Microsoft.SqlServer.Replication.BusinessLogicSupport.dll e clique em OK.

  9. No menu Exibir, clique em Código.

  10. No código, antes da instrução do namespace, digite as instruções using a seguir para qualificar os tipos nos namespaces RMO:

    // These namespaces are required.
    using Microsoft.SqlServer.Replication;
    using Microsoft.SqlServer.Management.Common;
    // This namespace is only used when creating custom business
    // logic for merge replication.
    using Microsoft.SqlServer.Replication.BusinessLogicSupport; 
    

Para criar um novo projeto do Microsoft Visual Basic .NET

  1. Inicie o Visual Studio.

  2. No menu Arquivo, selecione Novo Projeto. A caixa de diálogo Novo Projeto será exibida.

  3. No painel Tipos de Projeto, selecione Visual Basic. No painel Modelos, selecione Aplicativo do Windows.

  4. (Opcional) Na caixa Nome, digite o nome do novo aplicativo.

  5. Clique em OK para carregar o modelo do Windows do Visual Basic.

  6. No menu Projeto, selecione Adicionar Referência. A caixa de diálogo Adicionar Referência será exibida.

  7. Selecione os assembly a seguir na lista da guia .NET e clique em OK.

    • Interface de programação .NET Microsoft.SqlServer.Replication

    • Microsoft.SqlServer.ConnectionInfo

    • Biblioteca de agentes de replicação

    ObservaçãoObservação

    Use a tecla CTRL para selecionar mais de um arquivo.

  8. (Opcional) Repita a etapa 6. Clique na guia Procurar, navegue até C:\Arquivos de Programas\Microsoft SQL Server\100\COM, selecione Microsoft.SqlServer.Replication.BusinessLogicSupport.dll e clique em OK.

  9. No menu Exibir, clique em Código.

  10. No código, antes de qualquer instrução, digite as instruções Imports a seguir para qualificar os tipos nos namespaces RMO.

    ' These namespaces are required.
    Imports Microsoft.SqlServer.Replication
    Imports Microsoft.SqlServer.Management.Common
    ' This namespace is only used when creating custom business
    ' logic for merge replication.
    Imports Microsoft.SqlServer.Replication.BusinessLogicSupport 
    

Conectando a um servidor de replicação

Os objetos de programação RMO exigem que uma conexão a uma instância do SQL Server seja feita por meio de uma instância da classe ServerConnection. Essa conexão ao servidor é feita de forma independente de qualquer objeto da programação RMO. Então, ela é passada para o objeto RMO, seja durante a criação da instância, seja pela atribuição à propriedade ConnectionContext do objeto. Dessa maneira, um objeto de programação de RMO e as instâncias de objeto de conexão podem ser criados e gerenciados separadamente, e um único objeto de conexão pode ser reutilizado com vários objetos de programação de RMO. As regras a seguir se aplicam a conexões com um servidor de replicação:

  • Todas as propriedades da conexão são definidas para um determinado objeto de ServerConnection.

  • Uma conexão com cada instância do SQL Server precisa ter seu próprio objeto ServerConnection.

  • O objeto ServerConnection é atribuído à propriedade ConnectionContext do objeto da programação RMO criado ou acessado no servidor.

  • O método Connect abre a conexão ao servidor. Esse método deve ser chamado antes da chamada a qualquer método que acesse o servidor em qualquer objeto da programação RMO que usa a conexão.

  • Como o RMO e o SMO do SQL Server usam a classe ServerConnection para conexões ao SQL Server, a mesma conexão poderá ser usada por objetos RMO e SMO. Para obter mais informações, consulte Conectando-se a uma instância do SQL Server.

  • Todas as informações sobre autenticação para estabelecer com êxito a conexão e o logon no servidor são fornecidas no objeto ServerConnection.

  • A Autenticação do Windows é padrão. Para usar a Autenticação do SQL Server, LoginSecure deve ser definido como false e Login e Password deve ser definido como um logon e uma senha do SQL Server válidos. As credenciais de segurança sempre deverão ser armazenadas e manipuladas com segurança, além de serem fornecidas em tempo de execução quando possível.

  • Para aplicativos multithreaded, um objeto ServerConnection separado deveria ser usado em cada thread.

Chame o método Disconnect no objeto ServerConnection para fechar conexões de servidor ativas usadas por objetos RMO.

Definindo propriedades RMO

As propriedades de objetos da programação RMO representam as propriedades desses objetos de replicação no servidor. Durante a criação de novos objetos de replicação no servidor, serão usadas propriedades RMO em sua definição. Para objetos existentes, as propriedades RMO representam as propriedades do objeto existente, que só poderão ser modificadas para as propriedades passíveis de escrita ou configuração. As propriedades só podem ser definidas em objetos novos ou em objetos existentes.

Definindo propriedades para objetos de replicação novos

Durante a criação de um novo objeto de replicação no servidor, será preciso especificar todas as propriedades exigidas antes de chamar o método Create do objeto. Para obter mais informações sobre a definição de propriedades para um objeto de replicação novo, consulte Como configurar a publicação e a distribuição (Programação RMO).

Definindo propriedades para objetos de replicação existentes

Para objetos de replicação existentes no servidor, dependendo do objeto, o RMO poderia oferecer suporte à capacidade de alterar algumas ou todas as suas propriedades. Somente as propriedades passíveis de escrita ou configuração podem ser alteradas. Antes de alterar as propriedades, chame o método Load ou o método LoadProperties para obter as propriedades atuais do servidor. Chamar esses métodos indica que um objeto existente está sendo modificado.

Por padrão, ao alterar propriedades do objeto, o RMO confirma essas alterações no servidor com base no modo de execução do ServerConnection usado. O método IsExistingObject pode ser usado para verificar a existência de um objeto no servidor antes da tentativa de recuperação ou de alteração de suas propriedades. Para obter mais informações sobre como alterar as propriedades de um objeto de replicação, consulte Como exibir e modificar as propriedades do Publicador e do Distribuidor (programação RMO).

ObservaçãoObservação

Quando vários clientes RMO ou várias instâncias de um objeto da programação RMO estiverem acessando o mesmo objeto de replicação no servidor, o método Refresh do objeto RMO poderá ser chamado para atualizar as propriedades com base no estado atual do objeto no servidor.

Armazenando alterações de propriedade em cache

Quando a propriedade SqlExecutionModes é definida como CaptureSql, todas as instruções Transact-SQL geradas pelo RMO são capturadas para que possam ser executadas manualmente em um único lote usando um dos métodos de execução. O RMO permite que você armazene alterações de propriedade em cache e confirme-as em um único lote usando o método CommitPropertyChanges do objeto. Para armazenar as alterações de propriedade em cache, a propriedade CachePropertyChanges do objeto deve ser definida como true. Durante o armazenamento das alterações de propriedade em cache no RMO, o objeto ServerConnection ainda controlará o momento em que as alterações serão enviadas ao servidor. Para obter mais informações sobre como armazenar alterações de propriedade em cache para um objeto de replicação, consulte Como exibir e modificar as propriedades do Publicador e do Distribuidor (programação RMO).

Observação importanteImportante

Embora a classe ServerConnection ofereça suporte à declaração explícita de transações durante a configuração de propriedades, tais transações poderão interferir em transações internas de replicação, poderão gerar resultados inesperados e não deverão ser usadas com RMO.

Exemplo

Este exemplo demonstra o cache de alterações de propriedade. As alterações feitas nos atributos de uma publicação transacional são armazenadas em cache até serem explicitamente enviadas ao servidor.

          // Define the server, database, and publication names
            string publisherName = publisherInstance;
            string publicationName = "AdvWorksProductTran";
            string publicationDbName = "AdventureWorks2008R2";

            TransPublication publication;

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

            try
            {
                // Connect to the Publisher.
                conn.Connect();

                // Set the required properties for the publication.
                publication = new TransPublication();
                publication.ConnectionContext = conn;
                publication.Name = publicationName;
                publication.DatabaseName = publicationDbName;

                // Explicitly enable caching of property changes on this object.
                publication.CachePropertyChanges = true;

                // If we can't get the properties for this publication, 
                // throw an application exception.
                if (publication.LoadProperties())
                {
                    // Enable support for push subscriptions and disable support 
                    // for pull subscriptions.
                    if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
                    {
                        publication.Attributes ^= PublicationAttributes.AllowPull;
                    }
                    if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
                    {
                        publication.Attributes |= PublicationAttributes.AllowPush;
                    }

                    // Send changes to the server.
                    publication.CommitPropertyChanges();
                }
                else
                {
                    throw new ApplicationException(String.Format(
                        "Settings could not be retrieved for the publication. " +
                        "Ensure that the publication {0} exists on {1}.",
                        publicationName, publisherName));
                }
            }
            catch (Exception ex)
            {
                // Do error handling here.
                throw new ApplicationException(
                    "The publication property could not be changed.", ex);
            }
            finally
            {
                conn.Disconnect();
            }