Procédure : créer un abonnement par envoi de données (programmation RMO)
Vous pouvez créer des abonnements par envoi de données à l'aide des objets de gestion de réplication (RMO). Les classes RMO que vous utilisez pour créer un abonnement par envoi de données dépendent du type de publication sur laquelle l'abonnement a été créé.
Remarque relative à la sécurité |
---|
Dans la mesure du possible, invitez les utilisateurs à entrer les informations d'identification de sécurité au moment de l'exécution. Si vous devez stocker des informations d'identification, utilisez les Services de chiffrement fournis par Microsoft Windows .NET Framework. |
Pour créer un abonnement par envoi de données vers une capture instantanée ou une publication transactionnelle
Créez une connexion à l'Agent de publication à l'aide de la classe ServerConnection.
Créez une instance de la classe TransPublication en utilisant la connexion de l'Agent de publication à partir de l'étape 1. Spécifiez Name, DatabaseName et ConnectionContext.
Appelez la méthode LoadProperties. Si elle retourne la valeur false, les propriétés spécifiées à l'étape 2 sont incorrectes, ou la publication n'existe pas sur le serveur.
Effectuez une opération AND logique au niveau du bit (& dans Visual C# et And dans Visual Basic) entre la propriété Attributes et AllowPush. Si le résultat est None, appliquez àAttributes le résutat d'une opération OR logique au niveau du bit (| dans Visual C# et Or dans Visual Basic) entre Attributes et AllowPush. Appelez ensuite CommitPropertyChanges pour activer les abonnements par envoi de données.
Si la base de données d'abonnements n'existe pas, créez-la en utilisant la classe Database. Pour plus d'informations, consultez Création, modification et suppression de bases de données.
Crée une instance de la classe TransSubscription.
Définissez les propriétés suivantes des abonnements :
ServerConnection sur l'Agent de publication créé à l'étape 1 pour ConnectionContext.
Nom de la base de données d'abonnements pour SubscriptionDBName.
Nom de l'abonné pour SubscriberName.
Nom de la base de données de publication pour DatabaseName.
Nom de la publication pour PublicationName.
Champs Login et Password ou SecurePassword de SynchronizationAgentProcessSecurity pour fournir les informations d'identification pour le compte Microsoft Windows sous lequel l'Agent de distribution fonctionne sur le serveur de distribution. Ce compte permet de créer des connexions locales avec le serveur de distribution et des connexions distantes à l'aide de l'authentification Windows.
[!REMARQUE]
La configuration de SynchronizationAgentProcessSecurity lorsqu'un abonnement est créé par un membre du rôle de serveur sysadmin n'est pas nécessaire, mais elle est néanmoins recommandée. Dans ce cas, l'Agent va emprunter l'identité du compte de l'Agent SQL Server. Pour plus d'informations, consultez Modèle de sécurité de l'Agent de réplication.
(Facultatif) Valeur true (par défaut) de CreateSyncAgentByDefault pour créer un travail de l'Agent qui permet de synchroniser l'abonnement. Si vous spécifiez false, l'abonnement peut uniquement être synchronisé par programme.
(Facultatif) Définissez les champs SqlStandardLogin et SqlStandardPassword ou SecureSqlStandardPassword deSubscriberSecurity lorsque vous utilisez l'authentification SQL Server pour vous connecter à l'abonné.
Appelez la méthode Create.
Remarque relative à la sécurité Lors de la création d'un abonnement par envoi de données avec un serveur de distribution distant, les valeurs fournies pour toutes les propriétés, y compris SynchronizationAgentProcessSecurity et job_password, sont envoyées au serveur de distribution en texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'appeler la méthode Create. Pour plus d'informations, consultez Chiffrement des connexions à SQL Server.
Pour créer un abonnement par envoi de données vers une publication de fusion
Créez une connexion à l'Agent de publication à l'aide de la classe ServerConnection.
Créez une instance de la classe MergePublication en utilisant la connexion de l'Agent de publication à partir de l'étape 1. Spécifiez Name, DatabaseName et ConnectionContext.
Appelez la méthode LoadProperties. Si elle retourne la valeur false, les propriétés spécifiées à l'étape 2 sont incorrectes, ou la publication n'existe pas sur le serveur.
Effectuez une opération AND logique au niveau du bit (& dans Visual C# et And dans Visual Basic) entre la propriété Attributes et AllowPush. Si le résultat est None, appliquez àAttributes le résutat d'une opération OR logique au niveau du bit (| dans Visual C# et Or dans Visual Basic) entre Attributes et AllowPush. Appelez ensuite CommitPropertyChanges pour activer les abonnements par envoi de données.
Si la base de données d'abonnements n'existe pas, créez-la en utilisant la classe Database. Pour plus d'informations, consultez Création, modification et suppression de bases de données.
Créez une instance de la classe MergeSubscription.
Définissez les propriétés suivantes des abonnements :
ServerConnection sur l'Agent de publication créé à l'étape 1 pour ConnectionContext.
Nom de la base de données d'abonnements pour SubscriptionDBName.
Nom de l'abonné pour SubscriberName.
Nom de la base de données de publication pour DatabaseName.
Nom de la publication pour PublicationName.
Champs Login et Password ou SecurePassword de SynchronizationAgentProcessSecurity pour fournir les informations d'identification pour le compte Microsoft Windows sous lequel l'Agent de fusion fonctionne sur le serveur de distribution. Ce compte permet de créer des connexions locales avec le serveur de distribution et des connexions distantes à l'aide de l'authentification Windows.
[!REMARQUE]
La configuration de SynchronizationAgentProcessSecurity lorsqu'un abonnement est créé par un membre du rôle serveur fixe sysadmin n'est pas nécessaire, mais elle est néanmoins recommandée. Dans ce cas, l'Agent va emprunter l'identité du compte de l'Agent SQL Server. Pour plus d'informations, consultez Modèle de sécurité de l'Agent de réplication.
(Facultatif) Valeur true (par défaut) de CreateSyncAgentByDefault pour créer un travail de l'Agent qui permet de synchroniser l'abonnement. Si vous spécifiez false, l'abonnement peut uniquement être synchronisé par programme.
(Facultatif) Définissez les champs SqlStandardLogin et SqlStandardPassword ou SecureSqlStandardPassword deSubscriberSecurity lorsque vous utilisez l'authentification SQL Server pour vous connecter à l'abonné.
(Facultatif) Définissez les champs SqlStandardLogin et SqlStandardPassword ou SecureSqlStandardPassword dePublisherSecurity lorsque vous utilisez l'authentification SQL Server pour vous connecter au serveur de publication.
Appelez la méthode Create.
Remarque relative à la sécurité Lors de la création d'un abonnement par envoi de données avec un serveur de distribution distant, les valeurs fournies pour toutes les propriétés, y compris SynchronizationAgentProcessSecurity et job_password, sont envoyées au serveur de distribution en texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'appeler la méthode Create. Pour plus d'informations, consultez Chiffrement des connexions à SQL Server.
Exemple
Cet exemple crée un nouvel abonnement par envoi de données vers une publication transactionnelle. Les informations d'identification du compte Windows que vous utilisez pour exécuter le travail de l'Agent de distribution sont transmises lors de l'exécution.
// 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
Cet exemple crée un nouvel abonnement par envoi de données vers une publication de fusion. Les informations d'identification du compte Windows que vous utilisez pour exécuter le travail de l'Agent de fusion sont transmises lors de l'exécution.
// 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
Voir aussi