Esta documentación está archivada y no tiene mantenimiento.

Cómo sincronizar una suscripción de extracción (programación RMO)

Puede sincronizar suscripciones de extracción mediante programación utilizando Objetos de administración de réplica (RMO) y el acceso mediante código administrado a las funcionalidades del Agente de réplica. Las clases que se utilizan para sincronizar una suscripción de extracción dependen del tipo de publicación al que pertenece la suscripción.

ms147890.note(es-es,SQL.90).gifNota:
Si desea iniciar una sincronización que se ejecute de forma autónoma, sin afectar a la aplicación, inicie el agente de forma asincrónica. Sin embargo, si desea supervisar el resultado de la sincronización y recibir devoluciones de llamadas desde el agente durante el proceso de sincronización (por ejemplo, para mostrar una barra de progreso), debe iniciar el agente de forma sincrónica. Para los suscriptores de Microsoft SQL Server 2005 Express Edition, debe iniciar el agente de forma sincrónica.

  1. Cree una conexión al suscriptor mediante la clase ServerConnection.

  2. Cree una instancia de la clase TransPullSubscription y establezca las siguientes propiedades:

  3. Llame al método LoadProperties para obtener las demás propiedades de la suscripción. Si este método devuelve false, compruebe que la suscripción existe.

  4. Inicie el Agente de distribución en el suscriptor de una de las siguientes maneras:

    • Llame al método SynchronizeWithJob en la instancia de TransPullSubscription desde el paso 2. Este método inicia el Agente de distribución de forma asincrónica y el control vuelve inmediatamente a la aplicación mientras se ejecuta el trabajo del agente. No puede llamar a este método para los suscriptores de SQL Server 2005 Express Edition o si la suscripción se creó con el valor false para CreateSyncAgentByDefault (valor predeterminado).
    • Obtenga una instancia de la clase TransSynchronizationAgent desde la propiedad SynchronizationAgent y llame al método Synchronize. Este método inicia el agente de forma sincrónica, y el control permanece en el trabajo del agente que se ejecuta. Durante la ejecución sincrónica, puede controlar el evento Status mientras se ejecuta el agente.
      ms147890.note(es-es,SQL.90).gifNota:
      Si especificó el valor false para CreateSyncAgentByDefault (valor predeterminado) al crear la suscripción de extracción, también es necesario especificar Distributor, DistributorSecurityMode y, opcionalmente, DistributorLogin y DistributorPassword, ya que los metadatos relacionados con el agente del trabajo para la suscripción no están disponibles en MSsubscription_properties.

  1. Cree una conexión al suscriptor mediante la clase ServerConnection.

  2. Cree una instancia de la clase MergePullSubscription y establezca las siguientes propiedades:

    • La base de datos de suscripciones para DatabaseName.
    • El nombre de la publicación a la que pertenece la suscripción para PublicationName.
    • El nombre de la base de datos publicada para PublicationDBName.
    • El nombre del publicador para PublisherName.
    • La conexión creada en el paso 1 para ConnectionContext.
  3. Llame al método LoadProperties para obtener las demás propiedades de la suscripción. Si este método devuelve false, compruebe que la suscripción existe.

  4. Inicie el Agente de mezcla en el suscriptor de una de las siguientes maneras:

En este ejemplo, se sincroniza una suscripción de extracción para una publicación transaccional, en la que el agente se inicia de forma asincrónica usando el trabajo del agente.

// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksProductTran";
String publicationDbName = "AdventureWorks";
String subscriptionDbName = "AdventureWorksReplica";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

TransPullSubscription subscription;

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

    // Define subscription properties.
    subscription = new TransPullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription and the job exists, start the agent job.
    if (subscription.LoadProperties() && subscription.AgentJobId != null)
    {
        subscription.SynchronizeWithJob();
    }
    else
    {
        // Do something here if the subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exists on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Do appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}

En este ejemplo, se sincroniza una suscripción de extracción para una publicación transaccional, en la que el agente se inicia de forma sincrónica.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

TransPullSubscription subscription;

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

    // Define the pull subscription.
    subscription = new TransPullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription exists, then start the synchronization.
    if (subscription.LoadProperties())
    {
        // Check that we have enough metadata to start the agent.
        if (subscription.PublisherSecurity != null)
        {
            // Synchronously start the Distribution Agent for the subscription.
            subscription.SynchronizationAgent.Synchronize();
        }
        else
        {
            throw new ApplicationException("There is insufficent metadata to " +
                "synchronize the subscription. Recreate the subscription with " +
                "the agent job or supply the required agent properties at run time.");
        }
    }
    else
    {
        // Do something here if the pull subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be " +
        "synchronized. Verify that the subscription has " +
        "been defined correctly.", ex);
}
finally
{
    conn.Disconnect();
}

En este ejemplo, se sincroniza una suscripción de extracción para una publicación de mezcla, en la que el agente se inicia de forma asincrónica usando el trabajo del agente.

// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksSalesOrdersMerge";
String publicationDbName = "AdventureWorks";
String subscriptionDbName = "AdventureWorksReplica";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

MergePullSubscription subscription;

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

    // Define subscription properties.
    subscription = new MergePullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription and the job exists, start the agent job.
    if (subscription.LoadProperties() && subscription.AgentJobId != null)
    {
        subscription.SynchronizeWithJob();
    }
    else
    {
        // Do something here if the subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exists on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Do appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}

En este ejemplo, se sincroniza una suscripción de extracción para una publicación de mezcla, en la que el agente se inicia de forma sincrónica.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

MergePullSubscription subscription;

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

    // Define the pull subscription.
    subscription = new MergePullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription exists, then start the synchronization.
    if (subscription.LoadProperties())
    {
        // Check that we have enough metadata to start the agent.
        if (subscription.PublisherSecurity != null || subscription.DistributorSecurity != null)
        {
            // Synchronously start the Merge Agent for the subscription.
            subscription.SynchronizationAgent.Synchronize();
        }
        else
        {
            throw new ApplicationException("There is insufficent metadata to " +
                "synchronize the subscription. Recreate the subscription with " +
                "the agent job or supply the required agent properties at run time.");
        }
    }
    else
    {
        // Do something here if the pull subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be " +
        "synchronized. Verify that the subscription has " +
        "been defined correctly.", ex);
}
finally
{
    conn.Disconnect();
}

En este ejemplo, se sincroniza una suscripción de extracción para una publicación de mezcla con la sincronización Web. La suscripción se creó sin el agente del trabajo y los metadatos relacionados con la suscripción, por lo que es necesario iniciar el agente de forma sincrónica y proporcionar información de suscripción adicional.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string distributorName = distributorInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/SalesOrders/replisapi.dll";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

MergePullSubscription subscription;
MergeSynchronizationAgent agent;

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

    // Define the pull subscription.
    subscription = new MergePullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription exists, then start the synchronization.
    if (subscription.LoadProperties())
    {
        // Get the agent for the subscription.
        agent = subscription.SynchronizationAgent;

        // Check that we have enough metadata to start the agent.
        if (agent.PublisherSecurityMode == null)
        {
            // Set the required properties that could not be returned
            // from the MSsubscription_properties table. 
            agent.PublisherSecurityMode = SecurityMode.Integrated;
            agent.DistributorSecurityMode = SecurityMode.Integrated;
            agent.Distributor = publisherName;
            agent.HostName = hostname;

            // Set optional Web synchronization properties.
            agent.UseWebSynchronization = true;
            agent.InternetUrl = webSyncUrl;
            agent.InternetSecurityMode = SecurityMode.Standard;
            agent.InternetLogin = winLogin;
            agent.InternetPassword = winPassword;
        }
        // Enable agent output to the console.
        agent.OutputVerboseLevel = 1;
        agent.Output = "";

        // Synchronously start the Merge Agent for the subscription.
        agent.Synchronize();
    }
    else
    {
        // Do something here if the pull subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be " +
        "synchronized. Verify that the subscription has " +
        "been defined correctly.", ex);
}
finally
{
    conn.Disconnect();
}

Mostrar: