Cómo crear una suscripción de inserción (programación RMO)

Las suscripciones de inserción se pueden crear mediante programación usando Objetos de administración de réplica (RMO). Las clases RMO que se utilizan para crear una suscripción de inserción dependen del tipo de publicación para el que se crea la suscripción.

ms146863.security(es-es,SQL.90).gifNota de seguridad:
Cuando sea posible, pida a los usuarios que proporcionen credenciales de seguridad en tiempo de ejecución. Si debe almacenar credenciales, use los servicios de cifrado (en inglés) proporcionados por Microsoft Windows .NET Framework.

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

  2. Cree una instancia de la clase TransPublication utilizando la conexión de publicador del paso 1. Especifique Name, DatabaseName y ConnectionContext.

  3. Llame al método LoadProperties. Si este método devuelve false, las propiedades especificadas en el paso 2 son incorrectas o la publicación no existe en el servidor.

  4. Ejecuta una operación lógica AND bit a bit (& en Visual C# y And en Visual Basic) entre la propiedad Attributes y AllowPush. Si el resultado es None, establezca Attributes en el resultado de una operación lógica OR bit a bit (| en Visual C# y Or en Visual Basic) entre Attributes y AllowPush. A continuación, llame a CommitPropertyChanges para habilitar las suscripciones de inserción.

  5. Si la base de datos de suscripciones no existe, créela con la clase Database. Para obtener más información, vea Creating, Altering, and Removing Databases.

  6. Cree una instancia de la clase TransSubscription.

  7. Establezca las siguientes propiedades de la suscripción:

    • La conexión ServerConnection al publicador creada en el paso 1 para ConnectionContext.
    • El nombre de la base de datos de suscripciones para SubscriptionDBName.
    • El nombre del suscriptor para SubscriberName.
    • El nombre de la base de datos de publicaciones para DatabaseName.
    • El nombre de la publicación para PublicationName.
    • Los campos Login y Password o SecurePassword de SynchronizationAgentProcessSecurity para proporcionar las credenciales para la cuenta de Microsoft Windows con la que se ejecuta el Agente de distribución en el distribuidor. Esta cuenta se utiliza para realizar conexiones locales al distribuidor y conexiones remotas con la autenticación de Windows.
      ms146863.note(es-es,SQL.90).gifNota:
      No es necesario configurar SynchronizationAgentProcessSecurity cuando un miembro de la función fija de servidor sysadmin crea la suscripción; sin embargo, es recomendable. En este caso, el agente suplantará a la cuenta del Agente SQL Server. Para obtener más información, vea Modelo de seguridad del Agente de réplica.

    • (Opcional) el valor true (predeterminado) para CreateSyncAgentByDefault para crear un trabajo del agente que se utiliza para sincronizar la suscripción. Si especifica false, la suscripción sólo puede sincronizarse mediante programación.
    • (Opcional) configure los campos SqlStandardLogin y SqlStandardPassword o SecureSqlStandardPassword de SubscriberSecurity si utiliza la autenticación de SQL Server para conectarse al suscriptor.
  8. Llame al método Create.

    ms146863.security(es-es,SQL.90).gifNota de seguridad:
    Al crear una suscripción de inserción en un publicador con un distribuidor remoto, los valores suministrados para todas las propiedades, incluido SynchronizationAgentProcessSecurity, se envían al distribuidor como texto sin formato. Debe cifrar la conexión entre el publicador y su distribuidor remoto antes de llamar al método Create. Para obtener más información, vea Cifrar conexiones a SQL Server.

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

  2. Cree una instancia de la clase MergePublication utilizando la conexión de publicador del paso 1. Especifique Name, DatabaseName y ConnectionContext.

  3. Llame al método LoadProperties. Si este método devuelve false, las propiedades especificadas en el paso 2 son incorrectas o la publicación no existe en el servidor.

  4. Ejecuta una operación lógica AND bit a bit (& en Visual C# y And en Visual Basic) entre la propiedad Attributes y AllowPush. Si el resultado es None, establezca Attributes en el resultado de una operación lógica OR bit a bit (| en Visual C# y Or en Visual Basic) entre Attributes y AllowPush. A continuación, llame a CommitPropertyChanges para habilitar las suscripciones de inserción.

  5. Si la base de datos de suscripciones no existe, créela con la clase Database. Para obtener más información, vea Creating, Altering, and Removing Databases.

  6. Cree una instancia de la clase MergeSubscription.

  7. Establezca las siguientes propiedades de la suscripción:

    • La conexión ServerConnection al publicador creada en el paso 1 para ConnectionContext.
    • El nombre de la base de datos de suscripciones para SubscriptionDBName.
    • El nombre del suscriptor para SubscriberName.
    • El nombre de la base de datos de publicaciones para DatabaseName.
    • El nombre de la publicación para PublicationName.
    • Los campos Login y Password o SecurePassword de SynchronizationAgentProcessSecurity para proporcionar las credenciales para la cuenta de Microsoft Windows con la que se ejecuta el Agente de mezcla en el distribuidor. Esta cuenta se utiliza para realizar conexiones locales al distribuidor y conexiones remotas con la autenticación de Windows.
      ms146863.note(es-es,SQL.90).gifNota:
      No es necesario configurar SynchronizationAgentProcessSecurity cuando un miembro de la función fija de servidor sysadmin crea la suscripción; sin embargo, es recomendable. En este caso, el agente suplantará a la cuenta del Agente SQL Server. Para obtener más información, vea Modelo de seguridad del Agente de réplica.

    • (Opcional) el valor true (predeterminado) para CreateSyncAgentByDefault para crear un trabajo del agente que se utiliza para sincronizar la suscripción. Si especifica false, la suscripción sólo puede sincronizarse mediante programación.
    • (Opcional) configure los campos SqlStandardLogin y SqlStandardPassword o SecureSqlStandardPassword de SubscriberSecurity si utiliza la autenticación de SQL Server para conectarse al suscriptor.
    • (Opcional) configure los campos SqlStandardLogin y SqlStandardPassword o SecureSqlStandardPassword de PublisherSecurity si utiliza la autenticación de SQL Server para conectarse al publicador.
  8. Llame al método Create.

    ms146863.security(es-es,SQL.90).gifNota de seguridad:
    Al crear una suscripción de inserción en un publicador con un distribuidor remoto, los valores suministrados para todas las propiedades, incluido SynchronizationAgentProcessSecurity, se envían al distribuidor como texto sin formato. Debe cifrar la conexión entre el publicador y su distribuidor remoto antes de llamar al método Create. Para obtener más información, vea Cifrar conexiones a SQL Server.

En este ejemplo se crea una suscripción de inserción para una publicación transaccional. Las credenciales de la cuenta de Windows utilizada para ejecutar el trabajo del Agente de distribución se pasan en tiempo de ejecución.

// 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();
}

En este ejemplo se crea una suscripción de inserción para una publicación de mezcla. Las credenciales de la cuenta de Windows utilizada para ejecutar el trabajo del Agente de mezcla se pasan en tiempo de ejecución.

// 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();
}

Adiciones de comunidad

AGREGAR
Mostrar: