Cómo crear una publicación (programación con RMO)
Puede crear publicaciones mediante programación con Objetos de administración de replicación (RMO). Las clases RMO que usa para crear una publicación dependen del tipo de publicación que crea.
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 proporcionados por Microsoft Windows .NET Framework. |
Para crear una publicación transaccional o de instantáneas
Cree una conexión al publicador mediante la clase ServerConnection.
Cree una instancia de la clase ReplicationDatabase para la base de datos de publicación, establezca la propiedad ConnectionContext en la instancia de ServerConnection del paso 1 y llame al método LoadProperties. Si LoadProperties devuelve false, compruebe que la base de datos existe.
Si la propiedad EnabledTransPublishing es false, establézcala en true.
Para una publicación transaccional, compruebe el valor de la propiedad LogReaderAgentExists. Si esta propiedad es true, un trabajo del Agente de registro del LOG ya existe para esta base de datos. Si esta propiedad es false, haga lo siguiente:
Establezca los campos Login y Password o SecurePassword de LogReaderAgentProcessSecurity para proporcionar las credenciales para la cuenta de Microsoft Windows con la que se ejecuta el Agente de registro del LOG.
[!NOTA]
No es necesario configurar LogReaderAgentProcessSecurity cuando un miembro de la función fija de servidor sysadmin crea la publicación. En este caso, el agente suplantará la cuenta del Agente SQL Server. Para obtener más información, vea Modelo de seguridad del Agente de replicación.
(Opcional) Configure los campos SqlStandardLogin y SqlStandardPassword o SecureSqlStandardPassword de LogReaderAgentPublisherSecurity si utiliza la autenticación de SQL Server para conectarse al Publicador.
Llame al método CreateLogReaderAgent para crear el trabajo del Agente de registro del LOG para la base de datos.
Cree una instancia de la clase TransPublication y establezca las propiedades siguientes para este objeto:
La ServerConnection del paso 1 para ConnectionContext.
El nombre de la base de datos publicada para DatabaseName.
Un nombre de publicación para Name.
Un PublicationType de Transactional o Snapshot.
Los campos Login y Password de SnapshotGenerationAgentProcessSecurity para proporcionar las credenciales de la cuenta de Windows con la que se ejecuta el trabajo del Agente de mezcla. Se usa esta cuenta también cuando el Agente de instantáneas realiza las conexiones al Distribuidor local y para cualquier conexión remota cuando se usa Autenticación de Windows.
[!NOTA]
No es necesario configurar SnapshotGenerationAgentProcessSecurity cuando un miembro de la función fija de servidor sysadmin crea la publicación. En este caso, el agente suplantará la cuenta del Agente SQL Server. Para obtener más información, vea Modelo de seguridad del Agente de replicación.
(Opcional) Los campos SqlStandardLogin y SqlStandardPassword o SecureSqlStandardPassword de SnapshotGenerationAgentPublisherSecurity si usa la autenticación de SQL Server para conectarse al Publicador.
(Opcional) Use el operador lógico OR inclusivo (| en Visual C# y Or en Visual Basic) y el operador lógico OR exclusivo (^ en Visual C# y Xor en Visual Basic) para establecer los valores PublicationAttributes para la propiedad Attributes.
(Opcional) El nombre del Publicador para PublisherName cuando el Publicador no es de SQL Server.
Llame al método Create para crear la publicación.
Nota de seguridad Cuando se configura un Publicador con un Distribuidor remoto, los valores suministrados para todas las propiedades, incluidos SnapshotGenerationAgentProcessSecurity, se envían al Distribuidor como texto simple. 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.
Llame al método CreateSnapshotAgent para crear el trabajo del Agente de instantáneas para la publicación.
Para crear una publicación de mezcla
Cree una conexión al Publicador mediante la clase ServerConnection.
Cree una instancia de la clase ReplicationDatabase para la base de datos de publicación, establezca la propiedad ConnectionContext en la instancia de ServerConnection del paso 1 y llame al método LoadProperties. Si LoadProperties devuelve false, compruebe que la base de datos existe.
Si la propiedad EnabledMergePublishing es false, establézcala en true y llame a CommitPropertyChanges.
Cree una instancia de la clase MergePublication y establezca las propiedades siguientes para este objeto:
La ServerConnection del paso 1 para ConnectionContext.
El nombre de la base de datos publicada para DatabaseName
Un nombre de publicación para Name.
Los campos Login y Password de SnapshotGenerationAgentProcessSecurity para proporcionar las credenciales de la cuenta de Windows con la que se ejecuta el trabajo del Agente de mezcla. Se usa esta cuenta también cuando el Agente de instantáneas realiza las conexiones al Distribuidor local y para cualquier conexión remota cuando se usa Autenticación de Windows.
[!NOTA]
No es necesario configurar SnapshotGenerationAgentProcessSecurity cuando un miembro de la función fija de servidor sysadmin crea la publicación. Para obtener más información, vea Modelo de seguridad del Agente de replicación.
(Opcional) Use el operador lógico OR inclusivo (| en Visual C# y Or en Visual Basic) y el operador lógico OR exclusivo (^ en Visual C# y Xor en Visual Basic) para establecer los valores PublicationAttributes para la propiedad Attributes.
Llame al método Create para crear la publicación.
Nota de seguridad Cuando se configura un Publicador con un Distribuidor remoto, los valores suministrados para todas las propiedades, incluidos SnapshotGenerationAgentProcessSecurity, se envían al Distribuidor como texto simple. 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.
Llame al método CreateSnapshotAgent para crear el trabajo del Agente de instantáneas para la publicación.
Ejemplo
Este ejemplo habilita la base de datos de AdventureWorks para la publicación transaccional, define un trabajo del Agente de registro del LOG y crea la publicación de AdvWorksProductTran. Se debe definir un artículo para esta publicación. Las credenciales de cuenta de Windows que se necesitan para crear el trabajo del Agente de registro del LOG y el trabajo del Agente de instantáneas se pasan en tiempo de ejecución. Para obtener información sobre cómo usar RMO para definir artículos de instantáneas y de transacciones, vea Cómo definir un artículo (programación con RMO).
// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks";
string publisherName = publisherInstance;
ReplicationDatabase publicationDb;
TransPublication publication;
// Create a connection to the Publisher using Windows Authentication.
ServerConnection conn;
conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Enable the AdventureWorks database for transactional publishing.
publicationDb = new ReplicationDatabase(publicationDbName, conn);
// If the database exists and is not already enabled,
// enable it for transactional publishing.
if (publicationDb.LoadProperties())
{
if (!publicationDb.EnabledTransPublishing)
{
publicationDb.EnabledTransPublishing = true;
}
// If the Log Reader Agent does not exist, create it.
if (!publicationDb.LogReaderAgentExists)
{
// Specify the Windows account under which the agent job runs.
// This account will be used for the local connection to the
// Distributor and all agent connections that use Windows Authentication.
publicationDb.LogReaderAgentProcessSecurity.Login = winLogin;
publicationDb.LogReaderAgentProcessSecurity.Password = winPassword;
// Explicitly set authentication mode for the Publisher connection
// to the default value of Windows Authentication.
publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = true;
// Create the Log Reader Agent job.
publicationDb.CreateLogReaderAgent();
}
}
else
{
throw new ApplicationException(String.Format(
"The {0} database does not exist at {1}.",
publicationDb, publisherName));
}
// Set the required properties for the transactional publication.
publication = new TransPublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Specify a transactional publication (the default).
publication.Type = PublicationType.Transactional;
// Activate the publication so that we can add subscriptions.
publication.Status = State.Active;
// Enable push and pull subscriptions and independent Distribition Agents.
publication.Attributes |= PublicationAttributes.AllowPull;
publication.Attributes |= PublicationAttributes.AllowPush;
publication.Attributes |= PublicationAttributes.IndependentAgent;
// Specify the Windows account under which the Snapshot Agent job runs.
// This account will be used for the local connection to the
// Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;
// Explicitly set the security mode for the Publisher connection
// Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;
if (!publication.IsExistingObject)
{
// Create the transactional publication.
publication.Create();
// Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent();
}
else
{
throw new ApplicationException(String.Format(
"The {0} publication already exists.", publicationName));
}
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"The publication {0} could not be created.", publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks"
Dim publisherName As String = publisherInstance
Dim publicationDb As ReplicationDatabase
Dim publication As TransPublication
' Create a connection to the Publisher using Windows Authentication.
Dim conn As ServerConnection
conn = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Enable the AdventureWorks database for transactional publishing.
publicationDb = New ReplicationDatabase(publicationDbName, conn)
' If the database exists and is not already enabled,
' enable it for transactional publishing.
If publicationDb.LoadProperties() Then
If Not publicationDb.EnabledTransPublishing Then
publicationDb.EnabledTransPublishing = True
End If
' If the Log Reader Agent does not exist, create it.
If Not publicationDb.LogReaderAgentExists Then
' Specify the Windows account under which the agent job runs.
' This account will be used for the local connection to the
' Distributor and all agent connections that use Windows Authentication.
publicationDb.LogReaderAgentProcessSecurity.Login = winLogin
publicationDb.LogReaderAgentProcessSecurity.Password = winPassword
' Explicitly set authentication mode for the Publisher connection
' to the default value of Windows Authentication.
publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = True
' Create the Log Reader Agent job.
publicationDb.CreateLogReaderAgent()
End If
Else
Throw New ApplicationException(String.Format( _
"The {0} database does not exist at {1}.", _
publicationDb, publisherName))
End If
' Set the required properties for the transactional publication.
publication = New TransPublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' Specify a transactional publication (the default).
publication.Type = PublicationType.Transactional
'Enable push and pull subscriptions and independent Distribition Agents.
publication.Attributes = _
publication.Attributes Or PublicationAttributes.AllowPull
publication.Attributes = _
publication.Attributes Or PublicationAttributes.AllowPush
publication.Attributes = _
publication.Attributes Or PublicationAttributes.IndependentAgent
' Activate the publication so that we can add subscriptions.
publication.Status = State.Active
' Specify the Windows account under which the Snapshot Agent job runs.
' This account will be used for the local connection to the
' Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword
' Explicitly set the security mode for the Publisher connection
' Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True
If Not publication.IsExistingObject Then
' Create the transactional publication.
publication.Create()
' Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent()
Else
Throw New ApplicationException(String.Format( _
"The {0} publication already exists.", publicationName))
End If
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"The publication {0} could not be created.", publicationName), ex)
Finally
conn.Disconnect()
End Try
Este ejemplo habilita la base de datos de AdventureWorks para la publicación de mezcla y crea la publicación de AdvWorksSalesOrdersMerge. Todavía se deben definir artículos para esta publicación. Las credenciales de cuenta de Windows que se necesitan para crear el trabajo del Agente de registro del LOG se pasan en tiempo de ejecución. Para obtener información sobre cómo usar RMO para definir artículos de mezcla, vea Cómo definir un artículo (programación con RMO).
// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks";
ReplicationDatabase publicationDb;
MergePublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Enable the database for merge publication.
publicationDb = new ReplicationDatabase(publicationDbName, conn);
if (publicationDb.LoadProperties())
{
if (!publicationDb.EnabledMergePublishing)
{
publicationDb.EnabledMergePublishing = true;
}
}
else
{
// Do something here if the database does not exist.
throw new ApplicationException(String.Format(
"The {0} database does not exist on {1}.",
publicationDb, publisherName));
}
// Set the required properties for the merge publication.
publication = new MergePublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True;
// Specify the Windows account under which the Snapshot Agent job runs.
// This account will be used for the local connection to the
// Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;
// Explicitly set the security mode for the Publisher connection
// Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;
// Enable Subscribers to request snapshot generation and filtering.
publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
publication.Attributes |= PublicationAttributes.DynamicFilters;
// Enable pull and push subscriptions.
publication.Attributes |= PublicationAttributes.AllowPull;
publication.Attributes |= PublicationAttributes.AllowPush;
if (!publication.IsExistingObject)
{
// Create the merge publication.
publication.Create();
// Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent();
}
else
{
throw new ApplicationException(String.Format(
"The {0} publication already exists.", publicationName));
}
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"The publication {0} could not be created.", publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks"
Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Enable the database for merge publication.
publicationDb = New ReplicationDatabase(publicationDbName, conn)
If publicationDb.LoadProperties() Then
If Not publicationDb.EnabledMergePublishing Then
publicationDb.EnabledMergePublishing = True
End If
Else
' Do something here if the database does not exist.
Throw New ApplicationException(String.Format( _
"The {0} database does not exist on {1}.", _
publicationDb, publisherName))
End If
' Set the required properties for the merge publication.
publication = New MergePublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True
' Specify the Windows account under which the Snapshot Agent job runs.
' This account will be used for the local connection to the
' Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword
' Explicitly set the security mode for the Publisher connection
' Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True
' Enable Subscribers to request snapshot generation and filtering.
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowSubscriberInitiatedSnapshot
publication.Attributes = publication.Attributes Or _
PublicationAttributes.DynamicFilters
' Enable pull and push subscriptions
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPull
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPush
If Not publication.IsExistingObject Then
' Create the merge publication.
publication.Create()
' Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent()
Else
Throw New ApplicationException(String.Format( _
"The {0} publication already exists.", publicationName))
End If
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"The publication {0} could not be created.", publicationName), ex)
Finally
conn.Disconnect()
End Try