Conceptos de los Objetos de administración de replicación (RMO)

Objetos de administración de replicación (RMO) es un ensamblado de código administrado que encapsula las funcionalidades de replicación de SQL Server. RMO se implementa mediante el espacio de nombres Microsoft.SqlServer.Replication.

En los temas de las secciones siguientes se describe cómo puede utilizar RMO para controlar mediante programación las tareas de replicación:

Introducción a la programación de RMO

RMO está diseñado para programar todos los aspectos de la replicación de SQL Server. El espacio de nombres de RMO es Microsoft.SqlServer.Replication y lo implementa Microsoft.SqlServer.Rmo.dll, que es un ensamblado de Microsoft .NET Framework. El ensamblado Microsoft.SqlServer.Replication.dll, que también pertenece al espacio de nombres Microsoft.SqlServer.Replication, implementa una interfaz de código administrado para programar varios agentes de replicación (Agente de instantáneas, Agente de distribución y Agente de mezcla). Se puede tener acceso a sus clases desde RMO para sincronizar las suscripciones. Las clases en el espacio de nombres Microsoft.SqlServer.Replication.BusinessLogicSupport, que implementa el ensamblado Microsoft.SqlServer.Replication.BusinessLogicSupport.dll, se utilizan para crear una lógica empresarial personalizada para la replicación de mezcla. Este ensamblado es independiente de RMO.

Implementar aplicaciones basadas en RMO

RMO depende de los componentes de replicación y de conectividad de cliente que están incluidos con todas las versiones de SQL Server excepto SQL Server Compact. Para implementar una aplicación basada en RMO, debe instalar una versión de SQL Server que incluye componentes de replicación y de conectividad de cliente en el equipo en el que se vaya a ejecutar la aplicación.

Introducción a RMO

En esta sección se describe cómo iniciar un proyecto RMO simple utilizando Microsoft Visual Studio.

Para crear un proyecto nuevo de Microsoft Visual C#

  1. Inicie Visual Studio.

  2. En el menú Archivo, haga clic en Nuevoproyecto. Aparecerá el cuadro de diálogo Nuevo proyecto.

  3. En el cuadro de diálogo Tipos de proyecto, seleccione Proyectos de Visual C#. En el panel Plantillas, seleccione Aplicación para Windows.

  4. Opcional) En Nombre, escriba el nombre de la nueva aplicación.

  5. Haga clic en Aceptar para cargar la plantilla de Windows de Visual C#.

  6. En el menú Proyecto, seleccione el elemento Agregar referencia. Aparecerá el cuadro de diálogo Agregar referencia.

  7. Seleccione los ensamblados siguientes en la lista en la ficha .NET y, a continuación, haga clic en Aceptar.

    • Interfaz de programación Microsoft.SqlServer.Replication de .NET

    • Microsoft.SqlServer.ConnectionInfo

    • Biblioteca de agentes de replicación

    Nota

    Utilice la tecla CTRL para seleccionar más de un archivo.

  8. (Opcional) Repita el paso 6. Haga clic en la ficha Examinar, navegue a C:\Archivos de programa\Microsoft SQL Server\100\COM, seleccione Microsoft.SqlServer.Replication.BusinessLogicSupport.dll y, a continuación, haga clic en Aceptar.

  9. En el menú Ver, haga clic en Código.

  10. En el código, antes de la instrucción de espacio de nombres, escriba las instrucciones using siguientes para certificar los tipos en los espacios de nombres de 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 crear un nuevo proyecto de Microsoft Visual Basic .NET

  1. Inicie Visual Studio.

  2. En el menú Archivo, seleccione Nuevo proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto.

  3. En el panel Tipos de proyecto, seleccione Visual Basic. En el panel Plantillas, seleccione Aplicación para Windows.

  4. Opcional) En el cuadro Nombre, escriba el nombre de la nueva aplicación.

  5. Haga clic en Aceptar para cargar la plantilla de Windows de Visual Basic.

  6. En el menú Proyecto, seleccione Agregar referencia. Aparecerá el cuadro de diálogo Agregar referencia.

  7. Seleccione los ensamblados siguientes en la lista en la ficha .NET y, a continuación, haga clic en Aceptar.

    • Interfaz de programación Microsoft.SqlServer.Replication de .NET

    • Microsoft.SqlServer.ConnectionInfo

    • Biblioteca de agentes de replicación

    Nota

    Utilice la tecla CTRL para seleccionar más de un archivo.

  8. (Opcional) Repita el paso 6. Haga clic en la ficha Examinar, navegue a C:\Archivos de programa\Microsoft SQL Server\100\COM, seleccione Microsoft.SqlServer.Replication.BusinessLogicSupport.dll y haga clic en Aceptar.

  9. En el menú Ver, haga clic en Código.

  10. En el código, antes de ninguna declaración, escriba las instrucciones Imports siguientes para certificar los tipos en los espacios de nombres de 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 
    

Conectar a un servidor de replicación

Los objetos de programación de RMO requieren que se realice una conexión a una instancia de SQL Server mediante una instancia de la clase ServerConnection. Esta conexión al servidor se efectúa independientemente de cualquier objeto de programación de RMO. A continuación, se pasa al objeto RMO durante la creación de la instancia o por asignación a la propiedad ConnectionContext del objeto. De esta manera, se pueden crear y administrar los objetos de programación RMO y las instancias de objeto de conexión por separado y se puede reutilizar un objeto de conexión único con varios objetos de programación RMO. Las reglas siguientes se aplican a las conexiones a un servidor de replicación:

  • Todas las propiedades de la conexión se definen para un objeto ServerConnection dado.

  • Una conexión a cada instancia de SQL Server debe tener su propio objeto ServerConnection.

  • El objeto ServerConnection se asigna a la propiedad ConnectionContext del objeto de programación de RMO que se va a crear o al que se va a tener acceso en el servidor.

  • El método Connect abre la conexión al servidor. Se debe llamar a este método antes de llamar a cualquier método que tenga acceso al servidor en cualquier objeto de programación de RMO que use la conexión.

  • Dado que tanto RMO como Objetos de administración de SQL Server (SMO) usan la clase ServerConnection para las conexiones a SQL Server, los objetos SMO y RMO pueden utilizar la misma conexión. Para obtener más información, vea Conectarse a una instancia de SQL Server.

  • Toda la información de autenticación para realizar la conexión e iniciar sesión en el servidor correctamente se proporciona en el objeto ServerConnection.

  • La autenticación de Windows es el valor predeterminado. Para utilizar la autenticación de SQL Server, LoginSecure debe establecerse en el valor false y Login y Password debe establecerse en un inicio de sesión y una contraseña de SQL Server válidos. Las credenciales de seguridad siempre deben almacenarse y administrarse de forma segura, y se deben proporcionar en tiempo de ejecución cuando sea posible.

  • Para las aplicaciones multiproceso, se debe utilizar un objeto ServerConnection independiente en cada subproceso.

Llame al método Disconnect en el objeto ServerConnection para cerrar las conexiones al servidor activas que usan los objetos RMO.

Establecer las propiedades de RMO

Las propiedades de los objetos de programación de RMO representan las propiedades de estos objetos de replicación en el servidor. Al crear nuevos objetos de replicación en el servidor, se utilizan las propiedades de RMO para definirlos. En los objetos existentes, las propiedades de RMO representan sus propiedades, que sólo se pueden modificar en el caso de que se puedan escribir o configurar. Las propiedades se pueden establecer en los objetos nuevos o en los objetos existentes.

Establecer propiedades para los nuevos objetos de replicación

Al crear un nuevo objeto de replicación en el servidor, debe especificar todas las propiedades necesarias antes de llamar al método Create del objeto. Para obtener más información sobre cómo establecer las propiedades para un nuevo objeto de replicación, vea Cómo configurar la publicación y distribución (programación con RMO).

Establecer propiedades para los objetos de replicación existentes

Para algunos de los objetos de replicación que existen en el servidor, RMO podría admitir la capacidad de cambiar algunas o todas sus propiedades. Sólo es posible cambiar las propiedades que se puedan escribir o configurar. Para poder cambiar las propiedades, se debe llamar al método Load o LoadProperties para recibir las propiedades actuales del servidor. Llamar a estos métodos indica que un objeto existente se está modificando.

De forma predeterminada, al cambiar las propiedades del objeto, RMO confirma estos cambios en el servidor según el modo de ejecución de ServerConnection que se esté usando. El método IsExistingObject se puede utilizar para comprobar que un objeto existe en el servidor antes de intentar recuperar o cambiar sus propiedades. Para obtener más información sobre cómo cambiar las propiedades de un objeto de replicación, vea Cómo ver y modificar las propiedades del publicador y del distribuidor (programación con RMO).

Nota

Cuando varios clientes de RMO o varias instancias de un objeto de programación de RMO están teniendo acceso al mismo objeto de replicación en el servidor, se puede llamar al método Refresh del objeto RMO para actualizar las propiedades según el estado actual del objeto del servidor.

Almacenar en memoria caché los cambios de propiedades

Cuando la propiedad SqlExecutionModes está establecida en CaptureSql todas las instrucciones Transact-SQL generadas por RMO se capturan para que se puedan ejecutar manualmente en un lote único utilizando alguno de los métodos de ejecución. RMO le permite almacenar en memoria caché los cambios de las propiedades y las confirma conjuntamente en un único lote utilizando el método CommitPropertyChanges del objeto. Para almacenar en caché los cambios de las propiedades, la propiedad CachePropertyChanges del objeto debe estar establecida en true. Al almacenar en memoria caché los cambios de las propiedades en RMO, el objeto ServerConnection todavía controla cuándo se envían los cambios al servidor. Para obtener más información sobre cómo almacenar en memoria caché los cambios de propiedades para un objeto de replicación, vea Cómo ver y modificar las propiedades del publicador y del distribuidor (programación con RMO).

Nota importanteImportante

Aunque la clase ServerConnection permite declarar las transacciones explícitas al establecer las propiedades, tales transacciones pueden interferir con las transacciones de replicación internas, producir resultados imprevistos y no se deberían utilizar con RMO.

Ejemplo

En este ejemplo se muestra el almacenamiento en memoria caché de los cambios de las propiedades. Los cambios realizados en los atributos de una publicación transaccional se almacenan en memoria caché hasta que se envían explícitamente al 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();
            }