Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Managed Instance
Toto téma popisuje, jak v SQL Serveru vytvořit předplatné typu pull pomocí nástroje SQL Server Management Studio, jazyka Transact-SQL nebo objektů Replication Management Objects (RMO).
Nastavení pull předplatného pro P2P replikaci je možné pomocí skriptu, ale není dostupné přes průvodce.
Použití aplikace SQL Server Management Studio
Vytvořte odběr typu pull u Vydavatele nebo Odběratele pomocí Průvodce novým odběrem. Postupujte podle stránek v průvodci takto:
Zadejte vydavatele a publikaci.
Vyberte, kde se agenti replikace spouští. Pro odběr typu pull vyberte možnost Spustit každého agenta u příslušného odběratele (odběry typu pull) na stránce Distribution Agent Location nebo Merge Agent Location v závislosti na typu publikace.
Zadejte odběratele a databáze předplatných.
Zadejte přihlašovací jména a hesla používaná pro připojení provedená agenty replikace:
Pro odběry snímkových a transakčních publikací zadejte přihlašovací údaje na stránce Zabezpečení distribučního agenta.
Pro předplatná ke sloučení publikací zadejte přihlašovací údaje na stránce Zabezpečení agenta sloučení .
Informace o oprávněních vyžadovaných jednotlivými agenty najdete v tématu Model zabezpečení agenta replikace.
Zadejte plán synchronizace a čas inicializace odběratele.
Specifikujte další možnosti sloučení publikací: typ předplatného; hodnoty pro parametrizované filtrování; a informace pro synchronizaci přes HTTPS, pokud je publikace povolena pro webovou synchronizaci.
Specifikujte další možnosti pro transakční publikace, které umožňují aktualizaci odběrů: zda mají předplatitelé okamžitě zavést změny u Publisher, nebo je zapsat do fronty; přihlašovací údaje používané k připojení od předplatitele k Publisher.
Volitelně si předplatné naskriptujte.
Vytvoření odběrového předplatného u Vydavatele
Připojte se k publisheru v aplikaci Microsoft SQL Server Management Studio a potom rozbalte uzel serveru.
Rozbalte složku Replikace a potom rozbalte složku Místní publikace .
Klikněte pravým tlačítkem na publikaci, pro kterou chcete vytvořit jedno nebo více odběrů, a poté klikněte na Nová odběra.
Dokončete stránky v průvodci Novým předplatným.
Vytvoření předplatného typu pull na straně Subscriber
Připojte se ke Subscriber v SQL Server Management Studio a pak rozbalte uzel serveru.
Rozbalte složku Replikace .
Klikněte pravým tlačítkem myši na složku Místní předplatná a potom klikněte na nová předplatná.
Na stránce Publikace v Čaroudzi nového předplatného vyberte <Najít SQL Server Publisher> nebo <Najít Oracle Publisher> z rozbalovacího seznamu Publisher.
Připojte se k publisheru v dialogovém okně Připojit k serveru .
Vyberte publikaci na stránce Publikace .
Dokončete stránky v průvodci Novým předplatným.
Použití Transact-SQL
Odběry typu pull lze vytvářet programově pomocí uložených procedur pro replikaci. Použité uložené procedury budou záviset na typu publikace, do které předplatné patří.
Pro vytvoření pull předplatného na snapshot nebo transakční publikaci
Na serveru Publisher ověřte spuštěním sp_helppublication (Transact-SQL), že publikace podporuje odběry typu pull.
Pokud je hodnota allow_pull ve výsledné sadě 1, pak publikace podporuje pull subscriptions.
Pokud je hodnota allow_pull0, proveďte sp_changepublication (Transact-SQL), se zadáním allow_pull pro @property a true pro @value.
U odběratele proveďte sp_addpullsubscription (Transact-SQL). Upřesněte @publisher a @publication. Pro informace o aktualizaci předplatného viz Vytvořit aktualizovatelné předplatné transakční publikace.
U odběratele proveďte sp_addpullsubscription_agent (Transact-SQL). Zadejte následující:
Parametry @publisher, @publisher_db a @publication.
Přihlašovací údaje systému Microsoft Windows, pod nimiž je na odběrateli spuštěn agent distribuce pro @job_login a @job_password.
Note
Spojení vytvořená pomocí Windows integrované autentizace vždy používají Windows přihlašovací údaje specifikované @job_login a @job_password. Distribuční agent vždy vytvoří místní připojení k odběrateli pomocí integrovaného ověřování systému Windows. Ve výchozím nastavení se agent připojí k distributorovi pomocí Windows Integrated Authentication.
(Volitelné) Hodnota 0 pro @distributor_security_mode a SQL Server přihlašovací údaje pro @distributor_login a @distributor_password, pokud potřebujete použít SQL Server autentizaci při připojení k distributorovi.
Harmonogram pro úlohu distribučního agenta pro toto předplatné. Další informace naleznete v tématu Určení plánů synchronizace.
V Publisher provést sp_addsubscription (Transact-SQL) pro registraci pull předplatného. Zadejte @publication, @subscriber a @destination_db. Zadejte hodnotu pull pro @subscription_type.
Vytvořit předplatné typu pull k publikaci typu sloučení
V nástroji Publisher ověřte spuštěním sp_helpmergepublication (Transact-SQL), že publikace podporuje odběry typu pull.
Pokud je hodnota allow_pull ve výsledné sadě 1, pak publikace podporuje pull subscriptions.
Pokud je hodnota allow_pull0, spusťte sp_changemergepublication (Transact-SQL) se zadáním allow_pull pro @property a true pro @value.
U odběratele proveďte sp_addmergepullsubscription (Transact-SQL). Specifikujte @publisher, @publisher_db, @publication a následující parametry:
@subscriber_type - specifikujte lokální pro klientské předplatné a globální pro serverové předplatné.
@subscription_priority - Určete prioritu předplatného (0,00 až 99,99). To je vyžadováno pouze pro předplatné serveru.
Další informace najdete v tématu Pokročilé zjišťování a řešení konfliktů replikace sloučením.
Na odběrateli spusťte sp_addmergepullsubscription_agent (Transact-SQL). Zadejte následující parametry:
@publisher, @publisher_db a @publication.
Windows přihlašovací údaje, pod kterými Merge Agent u Subscriber běží pro @job_login a @job_password.
Note
Spojení vytvořená pomocí Windows integrované autentizace vždy používají Windows přihlašovací údaje specifikované @job_login a @job_password. Merge Agent vždy naváže lokální spojení s předplatitelem pomocí Windows Integrated Authentication. Ve výchozím nastavení se agent připojí k distributorovi a Publisher pomocí integrované autentizace Windows.
(Volitelné) Hodnota 0 pro @distributor_security_mode a SQL Server přihlašovací údaje pro @distributor_login a @distributor_password, pokud potřebujete použít SQL Server autentizaci při připojení k distributorovi.
(Volitelné) Hodnota 0 pro @publisher_security_mode a SQL Server přihlašovací údaje pro @publisher_login a @publisher_password, pokud potřebujete použít SQL Server autentizaci při připojení k Publisher.
Plán pro úlohu agenta pro slučování pro toto předplatné. Pro více informací viz Vytvořit aktualizovatelné předplatné transakční publikace.
Na serveru Publisher proveďte sp_addmergesubscription (Transact-SQL). Specifikujte @publication, @subscriber, @subscriber_db a hodnotu pull pro @subscription_type. Tím se zaregistruje odběr typu pull.
Příklady (Transact-SQL)
Následující příklad vytvoří odběrové předplatné pro transakční publikaci. První várka se provádí u předplatitele a druhá várka u Publisher. Hodnoty přihlášení a hesla se za běhu zadají pomocí proměnných skriptování 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'AdventureWorks';
-- At the subscription database, create a pull subscription
-- to a transactional publication.
USE [AdventureWorksReplica]
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'AdventureWorksReplica';
-- 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
Následující příklad vytváří pull předplatné pro sloučení publikace. První várka se provádí u předplatitele a druhá várka u Publisher. Přihlašovací a heslové hodnoty jsou zadávány za běhu pomocí skriptovacích proměnných 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'AdventureWorks';
SET @hostname = N'adventure-works\david8';
-- At the subscription database, create a pull subscription
-- to a merge publication.
USE [AdventureWorksReplica]
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'AdventureWorksReplica';
-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks]
EXEC sp_addmergesubscription @publication = @myMergePub,
@subscriber = @mySub, @subscriber_db = @mySubDB,
@subscription_type = N'pull';
GO
Použití objektů správy replikace (RMO)
Třídy RMO používané k vytvoření pull předplatného závisí na typu publikace, ke které předplatné patří.
Pro vytvoření pull předplatného na snapshot nebo transakční publikaci
Vytvořte připojení k odběrateli i vydavateli pomocí ServerConnection třídy.
Vytvořte instanci TransPublication třídy pomocí připojení Publisheru z kroku 1. Zadejte Name, DatabaseName a ConnectionContext.
Zavolejte metodu LoadProperties . Pokud tato metoda vrátí hodnotu false, buď vlastnosti zadané v kroku 2 jsou nesprávné nebo publikace na serveru neexistuje.
Proveďte bitovou logickou operaci AND (& v jazyce Visual C# a And v jazyce Visual Basic) mezi vlastností Attributes a AllowPull. Pokud je výsledek None, nastavte Attributes na výsledek bitové logické operace OR (| v jazyce Visual C# a Or v jazyce Visual Basic) mezi Attributes a AllowPull. Poté zavolejte CommitPropertyChanges, čímž povolíte odběry typu pull.
Pokud databáze předplatného neexistuje, vytvořte ji pomocí Database třídy. Pro více informací viz Vytváření, Měnit a Odstraňovat databáze.
Vytvořte instanci TransPullSubscription třídy.
Nastavte následující vlastnosti předplatného:
K odběrateli vytvořenému ServerConnection v kroku 1 pro ConnectionContext.
Název databáze předplatného pro DatabaseName.
Název vydavatele pro PublisherName.
Název databáze publikací pro PublicationDBName.
Název publikace pro PublicationName.
Pole LoginSynchronizationAgentProcessSecurity a Password poskytují přihlašovací údaje pro účet Microsoft Windows, pod kterým Distribution Agent běží u Subscriber. Tento účet slouží k navazování lokálních spojení s předplatitelem a k vzdáleným spojením pomocí ověřování Windows.
Note
Nastavení SynchronizationAgentProcessSecurity není nutné, pokud předplatné vytváří člen role pevného správce systému , ale doporučuje se. V takovém případě agent zosobní účet agenta SQL Serveru. Další informace naleznete v tématu Model zabezpečení agenta replikace.
(Volitelné) Hodnota true pro CreateSyncAgentByDefault k vytvoření úlohy agenta, která se používá k synchronizaci předplatného. Pokud zadáte false (výchozí nastavení), odběr lze synchronizovat pouze programově a při přístupu k tomuto objektu z vlastnosti SynchronizationAgent musíte zadat další vlastnosti objektu TransSynchronizationAgent. Další informace naleznete v tématu Synchronizace vyžádaného odběru.
Note
SQL Server Agent není dostupný ve všech edicích SQL Server. Když zadáte hodnotu true pro Express Subscribers, agentní role se nevytvoří. Důležitá metadata související s odběratelem jsou však uložena u Subscriber. Pro seznam funkcí podporovaných edicí v SQL Server viz Edice a podporované funkce SQL Server 2025.
(Volitelné) Při použití ověřování SQL Serveru pro připojení k Distributoru nastavte pole SqlStandardLogin a SqlStandardPassword nebo SecureSqlStandardPassword objektu DistributorSecurity.
Zavolejte metodu Create .
Pomocí instance třídy TransPublication z kroku 2 zavolejte metodu MakePullSubscriptionWellKnown pro registraci pull předplatného u Publisher. Pokud tato registrace již existuje, nastává výjimka.
Vytvořit předplatné typu pull k publikaci typu sloučení
Vytvořte spojení jak s předplatitelem, tak s Publisher pomocí této třídyServerConnection.
Vytvořte instanci MergePublication třídy pomocí připojení Publisheru z kroku 1. Zadejte Name, DatabaseNamea ConnectionContext.
Zavolejte metodu LoadProperties . Pokud tato metoda vrátí hodnotu false, buď vlastnosti zadané v kroku 2 jsou nesprávné nebo publikace na serveru neexistuje.
Proveďte bitovou logickou operaci AND (& v jazyce Visual C# a And v jazyce Visual Basic) mezi vlastností Attributes a AllowPull. Pokud je výsledek None, nastavte Attributes na výsledek bitové logické operace OR (| v jazyce Visual C# a Or v jazyce Visual Basic) mezi Attributes a AllowPull. Poté zavolejte CommitPropertyChanges, aby se povolily odběry typu pull.
Pokud databáze předplatného neexistuje, vytvořte ji pomocí Database třídy. Pro více informací viz Vytváření, Měnit a Odstraňovat databáze.
Vytvořte instanci MergePullSubscription třídy.
Nastavte následující vlastnosti předplatného:
ServerConnection, který byl vytvořen v kroku 1 pro odběratele ConnectionContext.
Název databáze předplatného pro DatabaseName.
Název vydavatele pro PublisherName.
Název databáze publikací pro PublicationDBName.
Název publikace pro PublicationName.
Pole LoginSynchronizationAgentProcessSecurity a Password slouží k poskytnutí přihlašovacích údajů pro účet Microsoft Windows, pod kterým Merge Agent běží u Subscriber. Tento účet slouží k navazování lokálních spojení s předplatitelem a k vzdáleným spojením pomocí ověřování Windows.
Note
Nastavení SynchronizationAgentProcessSecurity není nutné, pokud předplatné vytváří člen role pevného správce systému , ale doporučuje se. V takovém případě agent zosobní účet agenta SQL Serveru. Další informace naleznete v tématu Model zabezpečení agenta replikace.
(Volitelné) Nastavením hodnoty true pro CreateSyncAgentByDefault se vytvoří úloha agenta, která se používá k synchronizaci odběru. Pokud zadáte false (výchozí nastavení), lze předplatné synchronizovat pouze programově a při přístupu k tomuto objektu z vlastnosti SynchronizationAgent musíte zadat další vlastnosti objektu MergeSynchronizationAgent. Další informace naleznete v tématu Synchronizace vyžádaného odběru.
(Volitelné) Při použití ověřování SQL Serveru pro připojení k Distributoru nastavte pole SqlStandardLogin a SqlStandardPassword nebo SecureSqlStandardPassword u DistributorSecurity.
(Volitelné) Při použití ověřování SQL Serveru pro připojení k Vydavateli nastavte pole SqlStandardLogin a SqlStandardPassword nebo SecureSqlStandardPassword v PublisherSecurity.
Zavolejte metodu Create .
Pomocí instance třídy MergePublication z kroku 2 zavolejte metodu MakePullSubscriptionWellKnown pro registraci pull předplatného u Publisher. Pokud tato registrace již existuje, nastává výjimka.
Příklad (RMO)
Tento příklad vytvoří odběr typu pull pro transakční publikaci. Přihlašovací údaje k účtu Microsoft Windows použité k vytvoření Distribution Agent úlohy jsou předávány za běhu.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
//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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
'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
Tento příklad vytvoří odběr typu pull pro publikaci slučování. Přihlašovací údaje k účtu Windows použité k vytvoření úlohy Merge Agent jsou předávány za běhu.
// 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 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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
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
Tento příklad vytváří pull předplatné na sloučení publikace bez vytvoření přidružené agentní role a metadat předplatného v MSsubscription_properties. Přihlašovací údaje k účtu Windows použité k vytvoření úlohy Merge Agent jsou předávány za běhu.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
//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.
// Subscription 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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
'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.
' Subscription 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
Tento příklad vytvoří odběr typu pull pro publikaci typu merge, který lze synchronizovat přes internet pomocí webové synchronizace. Přihlašovací údaje k účtu Windows použité k vytvoření úlohy Merge Agent jsou předávány za běhu. Pro více informací viz Konfigurace webové synchronizace.
// 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";
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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
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
Související obsah
- koncepty objektů správy replikace
- Zobrazení a úprava vlastností pull odběru
- Konfigurace synchronizace webu
- Přihlásit se k odběru publikací
- Osvědčené postupy zabezpečení replikace