Cómo crear una suscripción de inserción (programación con RMO)
Las suscripciones de inserción se pueden crear mediante programación usando Objetos de administración de replicación (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.
Nota 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
Cree una conexión al publicador mediante la clase ServerConnection.
Cree una instancia de la clase TransPublication utilizando la conexión de publicador del paso 1. Especifique Name, DatabaseName y ConnectionContext.
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.
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.
Si la base de datos de suscripciones no existe, créela con la clase Database. Para obtener más información, vea Crear, modificar y eliminar bases de datos.
Cree una instancia de la clase TransSubscription.
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 replicación.
(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.
Llame al método Create.
Nota 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
Cree una conexión al publicador mediante la clase ServerConnection.
Cree una instancia de la clase MergePublication utilizando la conexión de publicador del paso 1. Especifique Name, DatabaseName y ConnectionContext.
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.
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.
Si la base de datos de suscripciones no existe, créela con la clase Database. Para obtener más información, vea Crear, modificar y eliminar bases de datos.
Cree una instancia de la clase MergeSubscription.
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 replicación.
(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.
Llame al método Create.
Nota 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