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.

Para crear una suscripción de inserción para una publicación de instantáneas o transaccional

  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.

      [!NOTA] 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.

Para crear una suscripción de inserción para una publicación de mezcla

  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.

      [!NOTA] 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.

Ejemplo

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();
}
' 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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"

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

' 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

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();
}
' 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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
Dim hostname As String = "adventure-works\garrett1"

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

' 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

Vea también

Tareas

Cómo crear una suscripción de inserción (programación de la réplica con Transact-SQL)
Cómo sincronizar una suscripción de inserción (programación RMO)

Otros recursos

Programming with Replication Management Objects
How to: Create a Publication (RMO Programming)
Suscribirse a publicaciones

Ayuda e información

Obtener ayuda sobre SQL Server 2005