Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique explique comment créer un abonnement par extraction dans SQL Server 2014 à l’aide de SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO).
La configuration d’un abonnement pull pour la réplication P2P est possible par script, mais n’est pas disponible par le biais de l’Assistant.
Utilisation de SQL Server Management Studio
Créez un abonnement de type pull chez l’Éditeur ou le Souscripteur à l’aide de l’Assistant Nouvel abonnement. Suivez les étapes dans l'assistant pour :
Spécifiez l'Éditeur et la publication.
Sélectionnez l’emplacement d’exécution des agents de réplication. Pour un abonnement par extraction, sélectionnez Exécuter chaque agent sur son Abonné (abonnements par extraction) sur la page Emplacement de l'agent de distribution ou sur la page Emplacement de l'agent de fusion, en fonction du type de publication.
Spécifiez des abonnés et des bases de données d’abonnement.
Spécifiez les connexions et les mots de passe utilisés pour les connexions effectuées par les agents de réplication :
Pour les abonnements aux publications instantanées et transactionnelle, spécifiez les informations d’identification sur la page Sécurité de l’agent de distribution.
Pour les abonnements aux publications de fusion, spécifiez les informations d’identification sur la page Sécurité de l’agent de fusion.
Pour plus d’informations sur les autorisations requises par chaque agent, consultez Le modèle de sécurité de l’agent de réplication.
Spécifiez une planification de synchronisation et quand l’Abonné doit être initialisé.
Spécifier des options supplémentaires pour les publications de fusion : type d’abonnement ; valeurs pour le filtrage paramétrable ; et des informations pour la synchronisation via HTTPS si la publication est activée pour la synchronisation web.
Spécifiez des options supplémentaires pour les publications transactionnelles qui autorisent la mise à jour des abonnements : si les Abonnés doivent valider immédiatement les modifications sur le serveur de publication ou les écrire dans une file d’attente ; informations d’identification utilisées pour se connecter à partir de l’Abonné au serveur de publication.
Si vous le souhaitez, scriptez l’abonnement.
Pour créer un abonnement par extraction à partir du serveur de publication
Connectez-vous au serveur de publication dans Microsoft SQL Server Management Studio, puis développez le nœud du serveur.
Développez le dossier Réplication , puis développez le dossier Publications locales .
Cliquez avec le bouton droit sur la publication pour laquelle vous souhaitez créer un ou plusieurs abonnements, puis cliquez sur Nouveaux abonnements.
Complétez les pages de l'Assistant de nouvelle abonnement.
Pour créer un abonnement par extraction à partir de l’Abonné
Connectez-vous à l’Abonné dans SQL Server Management Studio, puis développez le nœud du serveur.
Affichez le dossier Répliquer.
Cliquez avec le bouton droit sur le dossier Abonnements locaux , puis cliquez sur Nouveaux abonnements.
Dans la page Publication de l’Assistant Nouvel abonnement, sélectionnez <Rechercher un Éditeur SQL Server> ou <Rechercher un Éditeur Oracle> dans la liste déroulante Éditeur.
Connectez-vous au serveur de publication dans la boîte de dialogue Se connecter au serveur .
Sélectionnez une publication sur la page Publication.
Complétez les pages de l'Assistant de nouvelle abonnement.
Utilisation de Transact-SQL
Les abonnements par extraction peuvent être créés de manière programmatique à l’aide de procédures stockées de réplication. Les procédures stockées utilisées dépendent du type de publication auquel appartient l’abonnement.
Pour créer un abonnement de récupération à une publication instantanée ou transactionnelle
Sur le serveur de publication, vérifiez que la publication prend en charge les abonnements par extraction en exécutant sp_helppublication (Transact-SQL).
Si la valeur de allow_pull dans le jeu de résultats est 1, alors la publication prend en charge les abonnements pull.
Si la valeur de allow_pull est 0, exécutez sp_changepublication (Transact-SQL), en spécifiant allow_pull pour @property et
truepour @value.
Sur l’Abonné, exécutez sp_addpullsubscription (Transact-SQL). Spécifiez @publisher et @publication. Pour plus d’informations sur la mise à jour des abonnements, consultez Créer un abonnement pouvant être mis à jour vers une publication transactionnelle.
Sur l’Abonné, exécutez sp_addpullsubscription_agent (Transact-SQL). Spécifiez les éléments suivants :
Paramètres @publisher, @publisher_db et @publication .
Informations d’identification Microsoft Windows avec lesquelles l’Agent de distribution s’exécute sur l’Abonné pour @job_login et @job_password.
Remarque
Les connexions effectuées à l’aide de l’authentification intégrée Windows utilisent toujours les informations d’identification Windows spécifiées par @job_login et @job_password. L’Agent de distribution établit toujours la connexion locale à l’Abonné à l’aide de l’authentification intégrée Windows. Par défaut, l’agent se connecte au serveur de distribution à l’aide de l’authentification intégrée Windows.
(Facultatif) Valeur 0 pour @distributor_security_mode et les informations de connexion Microsoft SQL Server pour @distributor_login et @distributor_password, si vous devez utiliser l’authentification SQL Server lors de la connexion au serveur de distribution.
Planification du travail de l’Agent de distribution pour cet abonnement. Pour plus d’informations, consultez Spécifier des planifications de synchronisation.
Sur le serveur de publication, exécutez sp_addsubscription (Transact-SQL) pour inscrire l’abonnement par extraction. Spécifiez @publication, @subscriber et @destination_db. Spécifiez une valeur pull pour @subscription_type.
Pour créer un abonnement par extraction à une publication de fusion
Au niveau du serveur de publication, vérifiez que la publication prend en charge les abonnements pull en exécutant sp_helpmergepublication (Transact-SQL).
Si la valeur de allow_pull dans le jeu de résultats est 1, alors la publication prend en charge les abonnements par extraction.
Si la valeur de allow_pull est 0, exécutez sp_changemergepublication (Transact-SQL), en spécifiant allow_pull pour @property et
truepour @value.
Sur l’Abonné, exécutez sp_addmergepullsubscription (Transact-SQL). Spécifiez @publisher, @publisher_db, @publication et les paramètres suivants :
@subscriber_type : spécifiez local pour un abonnement client et global pour un abonnement serveur.
@subscription_priority : spécifiez une priorité pour l’abonnement (0,00 à 99,99). Cela n’est nécessaire qu’à un abonnement serveur.
Pour plus d’informations, consultez Détection et résolution avancées des conflits de réplication de fusion.
Sur l’Abonné, exécutez sp_addmergepullsubscription_agent (Transact-SQL). Spécifiez les paramètres suivants :
@publisher, @publisher_db et @publication.
Les informations d'identification Windows sous lesquelles l'agent de fusion s'exécute sur l'abonné pour @job_login et @job_password.
Remarque
Les connexions effectuées à l’aide de l’authentification intégrée Windows utilisent toujours les informations d’identification Windows spécifiées par @job_login et @job_password. L’Agent de fusion établit toujours la connexion locale à l’Abonné à l’aide de l’authentification intégrée Windows. Par défaut, l’agent se connecte au serveur de distribution et au serveur de publication à l’aide de l’authentification intégrée Windows.
(Facultatif) Valeur 0 pour @distributor_security_mode et les informations de connexion SQL Server pour @distributor_login et @distributor_password, si vous devez utiliser l’authentification SQL Server lors de la connexion au serveur de distribution.
(Facultatif) Valeur 0 pour @publisher_security_mode et les informations de connexion SQL Server pour @publisher_login et @publisher_password, si vous devez utiliser l’authentification SQL Server lors de la connexion au serveur de publication.
Calendrier de la tâche de l’Agent de fusion pour cet abonnement. Pour plus d’informations, consultez Créer un abonnement pouvant être mis à jour dans une publication transactionnelle.
Sur le Publisher, exécutez sp_addmergesubscription (Transact-SQL). Spécifiez @publication, @subscriber, @subscriber_db et une valeur d’extraction pour @subscription_type. Cela enregistre l’abonnement par extraction.
Exemples (Transact-SQL)
L’exemple suivant crée un abonnement par extraction vers une publication transactionnelle. Le premier lot est exécuté sur l’Abonné, et le deuxième lot est exécuté sur l'Éditeur. Les valeurs de connexion et de mot de passe sont fournies au moment de l’exécution à l’aide de variables de script sqlcmd.
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
-- At the subscription database, create a pull subscription
-- to a transactional publication.
USE [AdventureWorks2012Replica]
EXEC sp_addpullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addpullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password);
GO
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addsubscription
@publication = @publication,
@subscriber = @subscriber,
@destination_db = @subscriptionDB,
@subscription_type = N'pull',
@status = N'subscribed';
GO
L’exemple suivant crée un abonnement de type pull à une publication de fusion. Le premier lot est exécuté sur l’Abonné, et le deuxième lot est exécuté sur le Publieur. Les valeurs de connexion et de mot de passe sont fournies au moment de l’exécution à l’aide de variables de script sqlcmd .
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
SET @hostname = N'adventure-works\david8';
-- At the subscription database, create a pull subscription
-- to a merge publication.
USE [AdventureWorks2012Replica]
EXEC sp_addmergepullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addmergepullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password),
@hostname = @hostname;
GO
-- Execute this batch at the Publisher.
DECLARE @myMergePub AS sysname;
DECLARE @mySub AS sysname;
DECLARE @mySubDB AS sysname;
SET @myMergePub = N'AdvWorksSalesOrdersMerge';
SET @mySub = N'MYSUBSERVER';
SET @mySubDB = N'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2012]
EXEC sp_addmergesubscription @publication = @myMergePub,
@subscriber = @mySub, @subscriber_db = @mySubDB,
@subscription_type = N'pull';
GO
Utilisation des objets RMO (Replication Management Objects)
Les classes RMO utilisées pour créer un abonnement par extraction dépendent du type de publication auquel appartient l’abonnement.
Pour créer un abonnement de réception à une publication transactionnelle ou d’instantané
Créez des connexions à l’abonné et au serveur de publication à l’aide de la ServerConnection classe.
Créez une instance de la TransPublication classe à l’aide de la connexion Publisher à l’étape 1. Spécifiez Name, DatabaseName et ConnectionContext.
Appelez la méthode LoadProperties . Si cette méthode retourne
false, les propriétés spécifiées à l’étape 2 sont incorrectes ou la publication n’existe pas sur le serveur.Effectuez un AND logique au niveau du bit (
&en Visual C# etAnden Visual Basic) entre la Attributes propriété et AllowPull. Si le résultat est None, définissez Attributes sur le résultat d'une opération logique OU au niveau du bit (|en Visual C# etOren Visual Basic) entre Attributes et AllowPull. Ensuite, appelez CommitPropertyChanges pour activer les abonnements de type pull.Si la base de données d’abonnement n’existe pas, créez-la à l’aide de la Database classe. Pour plus d’informations, consultez Création, modification et suppression de bases de données.
Créez une instance de la TransPullSubscription classe.
Définissez les propriétés d’abonnement suivantes :
Accéder à ServerConnection de l’Abonné créé à l’étape 1 pour ConnectionContext.
Nom de la base de données d’abonnement pour DatabaseName.
Nom du serveur de publication pour PublisherName.
Nom de la base de données de publication pour PublicationDBName.
Nom de la publication pour PublicationName.
Les champs Login, Password ou SecurePassword* de SynchronizationAgentProcessSecurity servent à fournir les informations d’identification du compte Microsoft Windows sous lequel l’Agent de distribution s’exécute chez l’Abonné. Ce compte est utilisé pour établir des connexions locales à l’Abonné et établir des connexions à distance à l’aide de l’authentification Windows.
Remarque
Le paramètre SynchronizationAgentProcessSecurity n’est pas obligatoire lorsque l’abonnement est créé par un membre du
sysadminrôle serveur fixe, mais il est recommandé. Dans ce cas, l’agent emprunte l’identité du compte SQL Server Agent. Pour plus d’informations, consultez Le modèle de sécurité de l’agent de réplication.(Facultatif) Une valeur de
truepour CreateSyncAgentByDefault afin de créer un travail d’agent utilisé pour synchroniser l’abonnement. Si vous spécifiezfalse(valeur par défaut), l'abonnement peut uniquement être synchronisé par voie logicielle et vous devez spécifier des propriétés supplémentaires lorsque vous accédez à cet objet à partir de la propriété SynchronizationAgent. Pour plus d’informations, consultez Synchroniser un abonnement par extraction.Remarque
SQL Server Agent n’est pas disponible dans chaque édition de MicrosoftSQL Server. Pour obtenir la liste des fonctionnalités prises en charge par les éditions de SQL Server, consultez Fonctionnalités prises en charge par les éditions de SQL Server 2014. Lorsque vous spécifiez une valeur de
truepour les Abonnés Express, la tâche de l’agent n’est pas créée. Toutefois, les métadonnées importantes liées à l’abonnement sont stockées sur l’Abonné.(Facultatif) Définissez les champs SqlStandardLogin et SqlStandardPassword ou SecureSqlStandardPassword de DistributorSecurity lorsque vous utilisez l’authentification SQL Server pour vous connecter au distributeur.
Appelez la méthode Create .
À l'aide de l'instance de la classe TransPublication de l'étape 2, appelez MakePullSubscriptionWellKnown méthode pour inscrire l'abonnement par extraction auprès du Publisher. Si cette inscription existe déjà, une exception se produit.
Pour créer un abonnement par extraction à une publication de fusion
Créez des connexions avec l'abonné et l'éditeur en utilisant la classe ServerConnection.
Créez une instance de la MergePublication classe à l’aide de la connexion Publisher à l’étape 1. Spécifiez Name, DatabaseNameet ConnectionContext.
Appelez la méthode LoadProperties . Si cette méthode retourne
false, les propriétés spécifiées à l’étape 2 sont incorrectes ou la publication n’existe pas sur le serveur.Effectuez un AND logique au niveau du bit (
&en Visual C# etAnden Visual Basic) entre la Attributes propriété et AllowPull. Si le résultat est None, définissez Attributes sur le résultat d'une opération logique OU au niveau du bit (|en Visual C# etOren Visual Basic) entre Attributes et AllowPull. Ensuite, utilisez CommitPropertyChanges pour activer les abonnements de type pull.Si la base de données d’abonnement n’existe pas, créez-la à l’aide de la Database classe. Pour plus d’informations, consultez Création, modification et suppression de bases de données.
Créez une instance de la MergePullSubscription classe.
Définissez les propriétés d’abonnement suivantes :
Accédez à ServerConnection pour l’Abonné créé à l’étape 1 concernant ConnectionContext.
Nom de la base de données d’abonnement pour DatabaseName.
Nom du serveur de publication pour PublisherName.
Nom de la base de données de publication pour PublicationDBName.
Nom de la publication pour PublicationName.
Les champs Login et Password ou SecurePassword* de SynchronizationAgentProcessSecurity pour fournir les informations d'identification du compte Microsoft Windows, sous lequel l'Agent de fusion s'exécute sur l'abonné. Ce compte est utilisé pour établir des connexions locales à l’Abonné et établir des connexions à distance à l’aide de l’authentification Windows.
Remarque
Le paramètre SynchronizationAgentProcessSecurity n’est pas obligatoire lorsque l’abonnement est créé par un membre du
sysadminrôle serveur fixe, mais il est recommandé. Dans ce cas, l’agent emprunte l’identité du compte SQL Server Agent. Pour plus d’informations, consultez Le modèle de sécurité de l’agent de réplication.(Facultatif) Une valeur de
truepour CreateSyncAgentByDefault afin de créer un travail d’agent utilisé pour synchroniser l’abonnement. Si vous spécifiezfalse(valeur par défaut), l’abonnement peut uniquement être synchronisé par programme et vous devez spécifier des propriétés supplémentaires lorsque MergeSynchronizationAgent vous accédez à cet objet à partir de la SynchronizationAgent propriété. Pour plus d’informations, consultez Synchroniser un abonnement par extraction.(Facultatif) Définissez les champs SqlStandardLogin et SqlStandardPassword ou SecureSqlStandardPassword de DistributorSecurity lors de l'utilisation de l'authentification SQL Server pour se connecter au serveur de distribution.
(Facultatif) Définissez les champs SqlStandardLogin et SqlStandardPassword ou SecureSqlStandardPassword de PublisherSecurity lors de l'utilisation de l'authentification SQL Server pour vous connecter au Publisher.
Appelez la méthode Create .
À l'aide de l'instance de la classe MergePublication de l'étape 2, appelez la méthode MakePullSubscriptionWellKnown pour inscrire l'abonnement par extraction auprès du serveur de publication. Si cette inscription existe déjà, une exception se produit.
Exemple (RMO)
Cet exemple crée un abonnement par extraction vers une publication transactionnelle. Les informations d’identification du compte Microsoft Windows utilisées pour créer la tâche de l’Agent de distribution sont transmises à l’exécution.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
TransPublication publication;
TransPullSubscription subscription;
try
{
// Connect to the Publisher and Subscriber.
subscriberConn.Connect();
publisherConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new TransPublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.IsExistingObject)
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new TransPullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// 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 pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (TransSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName)
{
registered = true;
}
}
if (!registered)
{
// Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
TransSubscriberType.ReadOnly);
}
}
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
{
subscriberConn.Disconnect();
publisherConn.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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransPullSubscription
Try
' Connect to the Publisher and Subscriber.
subscriberConn.Connect()
publisherConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New TransPublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.IsExistingObject Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New TransPullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.Description = "Pull subscription to " + publicationDbName _
+ " on " + subscriberName + "."
' Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' 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 pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As TransSubscription In publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName And _
existing.SubscriptionDBName = subscriptionDbName Then
registered = True
End If
Next existing
If Not registered Then
' Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
TransSubscriberType.ReadOnly)
End If
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
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
Cet exemple crée un abonnement de type 'pull' à une publication de type 'merge'. Les informations d’identification du compte Windows utilisées pour créer le travail de l’Agent de fusion sont passées au moment de l’exécution.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
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
{
subscriberConn.Disconnect();
publisherConn.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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
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
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
Cet exemple crée un abonnement par extraction à une publication de fusion sans créer une tâche d'agent associée ni de métadonnées d’abonnement dans MSsubscription_properties. Les informations d’identification du compte Windows utilisées pour créer 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 = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify that an agent job not be created for this subscription. The
// subscription can only be synchronized by running the Merge Agent directly.
// Subscripition metadata stored in MSsubscription_properties will not
// be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = false;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
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
{
subscriberConn.Disconnect();
publisherConn.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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
' Specify that an agent job not be created for this subscription. The
' subscription can only be synchronized by running the Merge Agent directly.
' Subscripition metadata stored in MSsubscription_properties will not
' be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = False
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
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
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
Cet exemple crée un abonnement par extraction à une publication de fusion qui peut être synchronisée sur Internet grâce à la synchronisation Web. Les informations d’identification du compte Windows utilisées pour créer la tâche de l'Agent de fusion sont passées pendant l'exécution. Pour plus d’informations, consultez Configurer la synchronisation web.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions and Web synchronization.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
{
publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Enable Web synchronization.
subscription.UseWebSynchronization = true;
subscription.InternetUrl = webSyncUrl;
// Specify the same Windows credentials to use when connecting to the
// Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
subscription.InternetLogin = winLogin;
subscription.InternetPassword = winPassword;
// Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
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
{
subscriberConn.Disconnect();
publisherConn.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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions and Web synchronization.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowWebSynchronization
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
subscription.CreateSyncAgentByDefault = True
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Enable Web synchronization.
subscription.UseWebSynchronization = True
subscription.InternetUrl = webSyncUrl
' Specify the same Windows credentials to use when connecting to the
' Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
subscription.InternetLogin = winLogin
subscription.InternetPassword = winPassword
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
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
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
Voir aussi
Concepts liés à RMO (Replication Management Objects)
Afficher et modifier les propriétés d’un abonnement par extraction
Configurer la synchronisation web
S’abonner aux Publications
Meilleures pratiques en matière de sécurité de réplication