Jak Utworzyć migawkę dla publikacji korespondencji seryjnej za pomocą sparametryzowanych filtrów (Programowanie RMO)
Podczas generowania migawka do publikacja korespondencji seryjnej przy użyciu sparametryzowana filtry, najpierw należy wygenerować standard (schemat) migawka zawierający wszystkie metadane subskrybenta subskrypcja.Następnie generować część migawka, zawierający partycję specyficzne dla subskrybenta publikowane dane.Aby uzyskać więcej informacji, zobacz Jak Tworzenie migawki początkowego (Programowanie RMO).
Obiekty zarządzania replikacji (RMO) umożliwia generowanie podzielonym na partycje migawek programowo w następujący sposób:
Zezwalaj na subskrybentów żądanie migawka generacji i aplikacji pierwszego czas ich synchronizowania.
Wstępnie wygenerować migawek dla każdej partycji.
Ręcznie wygenerować migawkę każdego subskrybenta przez uruchomienie agenta migawka.
Ostrzeżenie
Podczas filtrowania artykuł plonów nie pokrywających się partycje, są unikatowe dla każdej subskrypcja (określając wartość NonOverlappingSingleSubscription dla PartitionOption podczas tworzenia artykuł korespondencji seryjnej), oczyścić metadane up w każdym przypadku, gdy działa Agent korespondencji seryjnej.Oznacza to, że szybciej wygasa partycjonowana migawka.Po wybraniu tej opcji należy rozważyć, umożliwiając subskrybentów żądania generacji migawka.Aby uzyskać więcej informacji, zobacz sekcję, za pomocą odpowiednich opcji filtrowania w temacie Filtry parametrami wiersza.
![]() |
---|
Jeśli to możliwe, monitują użytkowników o wprowadzenie poświadczenia zabezpieczeń w czasie wykonywania.Jeśli poświadczenia muszą być przechowywane, usługi kryptograficzne dostarczonych przez Microsoft systemu Windows.NET Framework. |
Aby utworzyć publikacja, która umożliwia abonentów do inicjowania generacji migawka i dostawy
Tworzenie połączenia do Wydawca za pomocą ServerConnection klasy
Utworzenie wystąpienie ReplicationDatabase klasy dla bazy danych publikacja zestaw ConnectionContext właściwość do wystąpienie ServerConnection z kroku 1 i wywołanie LoadProperties metoda.Jeśli LoadProperties zwraca false, upewnij się, że baza danych istnieje.
If EnabledMergePublishing property is false, zestaw it to true and call CommitPropertyChanges.
Utworzenie wystąpienie MergePublication klasy, a zestaw następujące właściwości tego obiektu:
ServerConnection z kroku 1 dla ConnectionContext.
Nazwa bazy danych opublikowanych dla DatabaseName.
Nazwę publikacja dla Name.
Maksymalna liczba zadań dynamiczna migawka uruchamianie dla MaxConcurrentDynamicSnapshots.Ponieważ zainicjowane subskrybenta migawki żądań może występować w dowolnym czas, właściwość ta ogranicza liczbę zadań Agent migawki, które można uruchomić jednocześnie, gdy wielu subskrybentów zażąda ich partycjonowana migawka, w tym samym czas.Uruchamiając maksymalną liczbę zadań, żądania dodatkowych partycjonowana migawka są umieszczane w kolejce do momentu zakończenia jednego zadania uruchomione.
Użyj logiczną lub logicznych (| w środowisku Visual C# i Or w języku Visual Basic) operator, aby dodać wartość AllowSubscriberInitiatedSnapshot do Attributes.
Login i Password pola SnapshotGenerationAgentProcessSecurity o podanie poświadczenia dla Microsoft konta systemu Windows, pod którym Agent migawki zadanie uruchamia.
Ostrzeżenie
Ustawienie SnapshotGenerationAgentProcessSecurity jest zalecane, gdy publikacja jest tworzona przez element członkowski sysadmin stała rola serwera.Aby uzyskać więcej informacji, zobacz Model zabezpieczeń Agent replikacji.
Wywołanie Create metoda tworzenia publikacja.
Uwaga dotycząca zabezpieczeń
Podczas konfigurowania Publisher z dystrybutor zdalny, wartości dostarczone dla wszystkich właściwości, łącznie z SnapshotGenerationAgentProcessSecurity, są wysyłane do dystrybutora jako zwykły tekst.Należy zaszyfrować połączenie między Wydawca i jego dystrybutor zdalny przed wywoływaniem Create metoda.Aby uzyskać więcej informacji, zobacz Szyfrowania połączeńSQL Server.
Użyj MergeArticle właściwość, aby dodać artykułów do publikacja.Określ FilterClause właściwość co najmniej jeden artykuł definiuje sparametryzowana filtru.(Opcjonalnie) Tworzenie MergeJoinFilter obiektów, które definiują filtry łączyć między artykułami.Aby uzyskać więcej informacji, zobacz Jak Definiowanie artykuł (Programowanie RMO).
Jeśli wartość SnapshotAgentExists jest false, call CreateSnapshotAgent utworzyć zadanie agenta migawki początkowego dla publikacja.
Wywołanie StartSnapshotGenerationAgentJob metoda MergePublication obiekt utworzony w kroku 4.Spowoduje to uruchomienie zadanie agenta, który generuje migawka początkowa.Aby uzyskać więcej informacji na temat generowania migawka początkowa i definiowanie niestandardowych harmonogramu dla agenta migawki, zobacz Jak Tworzenie migawki początkowego (Programowanie RMO).
(Opcjonalnie) Sprawdź, czy wartość true dla SnapshotAvailable właściwość w celu określenia, kiedy migawka początkowa jest gotowy do użycia.
Gdy Agent scalić abonenta połączy się w pierwszym czas, migawka podzielonym na partycje jest generowany automatycznie.
Tworzenie publikacja i pregenerate lub automatyczne odświeżanie migawki
Użyj wystąpienie z MergePublication klasy do definiowania publikacja korespondencji seryjnej.Aby uzyskać więcej informacji, zobacz Jak Tworzenie publikacji (Programowanie RMO).
Użyj MergeArticle właściwość, aby dodać artykułów do publikacja.Określ FilterClause właściwość co najmniej jeden artykuł definiuje sparametryzowana filtru i utworzyć MergeJoinFilter obiektów, które definiują filtry łączyć między artykułami.Aby uzyskać więcej informacji, zobacz Jak Definiowanie artykuł (Programowanie RMO).
Jeśli wartość SnapshotAgentExists jest false, call CreateSnapshotAgent utworzyć zadanie agenta migawka dla publikacja.
Wywołanie StartSnapshotGenerationAgentJob metoda MergePublication obiekt utworzony w kroku 1.Ta metoda uruchamia zadanie agenta, który generuje migawka początkowa.Więcej informacji na temat generowania migawka początkowa i definiowanie niestandardowych harmonogramu dla agenta migawki, zobacz Jak Tworzenie migawki początkowego (Programowanie RMO).
Sprawdź, czy wartość true dla SnapshotAvailable właściwość w celu określenia, kiedy migawka początkowa jest gotowy do użycia.
Utworzenie wystąpienie MergePartition klasy, a zestaw sparametryzowana kryteriów filtrowania dla subskrybenta przy użyciu jedną lub obie następujące właściwości:
Jeśli partycja abonenta jest zdefiniowana przez wynik SUSER_SNAME (Transact-SQL), użyj DynamicFilterLogin.
Jeśli partycja abonenta jest zdefiniowana przez wynik HOST_NAME (Transact-SQL) lub przeciążenie z tej funkcja, użyj DynamicFilterHostName.
Utworzenie wystąpienie MergeDynamicSnapshotJob klasy, a zestaw tej samej właściwości w kroku 6.
Użyj ReplicationAgentSchedule klasy ustalanie harmonogramu generowania filtrowane migawka dla partycji subskrybenta.
Przy użyciu wystąpienie MergePublication z kroku 1, wywołanie AddMergePartition.Przekazywanie MergePartition obiekt z kroku 6.
Przy użyciu wystąpienie MergePublication z kroku 1 wywołania AddMergeDynamicSnapshotJob metoda.Przekazywanie MergeDynamicSnapshotJob obiekt z kroku 7 oraz ReplicationAgentSchedule obiekt z kroku 8.
Wywołanie EnumMergeDynamicSnapshotJobsi zlokalizuj MergeDynamicSnapshotJob obiektu zadanie nowo dodane partycjonowana migawka w zwróconej tablicy.
Pobierz Name właściwość dla zadanie.
Tworzenie połączenia do dystrybutora za pomocą ServerConnection klasy
Tworzenie wystąpienie obiekty SMO (SQL Server Management obiektów) Server klasy, przekazując ServerConnection obiekt z kroku 13.
Utworzenie wystąpienie Job klasy, przekazując JobServer Właściwość Server obiekt z kroku 14 i nazwa zadanie z kroku 12.
Wywołanie Start metoda, aby uruchomić zadanie partycjonowana migawka.
Powtórz kroki 6-16 dla każdego subskrybenta.
Tworzenie publikacja i ręcznie tworzyć migawek dla każdej partycji
Użyj wystąpienie z MergePublication klasy do definiowania publikacja korespondencji seryjnej.Aby uzyskać więcej informacji, zobacz Jak Tworzenie publikacji (Programowanie RMO).
Użyj MergeArticle Właściwość dodanie artykułów do publikacja, określ FilterClause Właściwości co najmniej jeden artykuł definiuje sparametryzowana filtru i utworzyć MergeJoinFilter obiektów, które definiują filtry łączyć między artykułami.Aby uzyskać więcej informacji, zobacz Jak Definiowanie artykuł (Programowanie RMO).
Generowanie migawka początkowa.Aby uzyskać więcej informacji, zobacz Jak Tworzenie migawki początkowego (Programowanie RMO).
Utworzenie wystąpienie SnapshotGenerationAgent klasy, a zestaw następujące wymagane właściwości:
Publisher -NazwaWydawca
PublisherDatabase -Nazwa baza danych publikacji
Publication -Nazwa publikacja
Distributor -nazwę dystrybutora
PublisherSecurityMode-wartość Integrated do używane zintegrowane uwierzytelnianie systemu Windows lub wartość Standard do używania uwierzytelniania programu SQL Server.
DistributorSecurityMode-wartość Integrated do używane zintegrowane uwierzytelnianie systemu Windows lub wartość Standard do używania uwierzytelniania programu SQL Server.
Ustawiona wartość Merge dla ReplicationType.
Ustaw jedną lub więcej z następujących właściwości, aby zdefiniować parametry partycjonowanie:
Jeśli partycja abonenta jest zdefiniowana przez wynik SUSER_SNAME (Transact-SQL), użyj DynamicFilterLogin.
Jeśli partycja abonenta jest zdefiniowana przez wynik HOST_NAME (Transact-SQL) lub przeciążenie z tej funkcja, użyj DynamicFilterHostName.
Wywołanie GenerateSnapshot metoda.
Powtórz kroki 4–7 dla każdego subskrybenta.
Przykład
W tym przykładzie tworzony publikacja korespondencji seryjnej, umożliwiająca subskrybentów generacji żądanej migawka.
// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2008R2";
ReplicationDatabase publicationDb;
MergePublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Enable the database for merge publication.
publicationDb = new ReplicationDatabase(publicationDbName, conn);
if (publicationDb.LoadProperties())
{
if (!publicationDb.EnabledMergePublishing)
{
publicationDb.EnabledMergePublishing = true;
}
}
else
{
// Do something here if the database does not exist.
throw new ApplicationException(String.Format(
"The {0} database does not exist on {1}.",
publicationDb, publisherName));
}
// Set the required properties for the merge publication.
publication = new MergePublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True;
// Specify the Windows account under which the Snapshot Agent job runs.
// This account will be used for the local connection to the
// Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;
// Explicitly set the security mode for the Publisher connection
// Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;
// Enable Subscribers to request snapshot generation and filtering.
publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
publication.Attributes |= PublicationAttributes.DynamicFilters;
// Enable pull and push subscriptions.
publication.Attributes |= PublicationAttributes.AllowPull;
publication.Attributes |= PublicationAttributes.AllowPush;
if (!publication.IsExistingObject)
{
// Create the merge publication.
publication.Create();
// Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent();
}
else
{
throw new ApplicationException(String.Format(
"The {0} publication already exists.", publicationName));
}
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"The publication {0} could not be created.", publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2008R2"
Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Enable the database for merge publication.
publicationDb = New ReplicationDatabase(publicationDbName, conn)
If publicationDb.LoadProperties() Then
If Not publicationDb.EnabledMergePublishing Then
publicationDb.EnabledMergePublishing = True
End If
Else
' Do something here if the database does not exist.
Throw New ApplicationException(String.Format( _
"The {0} database does not exist on {1}.", _
publicationDb, publisherName))
End If
' Set the required properties for the merge publication.
publication = New MergePublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True
' Specify the Windows account under which the Snapshot Agent job runs.
' This account will be used for the local connection to the
' Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword
' Explicitly set the security mode for the Publisher connection
' Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True
' Enable Subscribers to request snapshot generation and filtering.
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowSubscriberInitiatedSnapshot
publication.Attributes = publication.Attributes Or _
PublicationAttributes.DynamicFilters
' Enable pull and push subscriptions
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPull
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPush
If Not publication.IsExistingObject Then
' Create the merge publication.
publication.Create()
' Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent()
Else
Throw New ApplicationException(String.Format( _
"The {0} publication already exists.", publicationName))
End If
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"The publication {0} could not be created.", publicationName), ex)
Finally
conn.Disconnect()
End Try
W tym przykładzie ręcznie tworzy partycję subskrybenta i filtrowane migawka do publikacja korespondencji seryjnej z filtrami parametrami wiersza.
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2008R2";
string distributorName = publisherInstance;
MergePublication publication;
MergePartition partition;
MergeDynamicSnapshotJob snapshotAgentJob;
ReplicationAgentSchedule schedule;
// Create a connection to the Publisher.
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create a connection to the Distributor to start the Snapshot Agent.
ServerConnection distributorConn = new ServerConnection(distributorName);
try
{
// Connect to the Publisher.
publisherConn.Connect();
// Set the required properties for the publication.
publication = new MergePublication();
publication.ConnectionContext = publisherConn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// If we can't get the properties for this merge publication,
// then throw an application exception.
if (publication.LoadProperties() || publication.SnapshotAvailable)
{
// Set a weekly schedule for the filtered data snapshot.
schedule = new ReplicationAgentSchedule();
schedule.FrequencyType = ScheduleFrequencyType.Weekly;
schedule.FrequencyRecurrenceFactor = 1;
schedule.FrequencyInterval = Convert.ToInt32(0x001);
// Set the value of Hostname that defines the data partition.
partition = new MergePartition();
partition.DynamicFilterHostName = hostname;
snapshotAgentJob = new MergeDynamicSnapshotJob();
snapshotAgentJob.DynamicFilterHostName = hostname;
// Create the partition for the publication with the defined schedule.
publication.AddMergePartition(partition);
publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule);
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication, " +
" or the initial snapshot has not been generated. " +
"Ensure that the publication {0} exists on {1} and " +
"that the Snapshot Agent has run successfully.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(string.Format(
"The partition for '{0}' in the {1} publication could not be created.",
hostname, publicationName), ex);
}
finally
{
publisherConn.Disconnect();
if (distributorConn.IsOpen) distributorConn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2008R2"
Dim distributorName As String = publisherInstance
Dim publication As MergePublication
Dim partition As MergePartition
Dim snapshotAgentJob As MergeDynamicSnapshotJob
Dim schedule As ReplicationAgentSchedule
' Create a connection to the Publisher.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create a connection to the Distributor to start the Snapshot Agent.
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)
Try
' Connect to the Publisher.
publisherConn.Connect()
' Set the required properties for the publication.
publication = New MergePublication()
publication.ConnectionContext = publisherConn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' If we can't get the properties for this merge publication,
' then throw an application exception.
If (publication.LoadProperties() Or publication.SnapshotAvailable) Then
' Set a weekly schedule for the filtered data snapshot.
schedule = New ReplicationAgentSchedule()
schedule.FrequencyType = ScheduleFrequencyType.Weekly
schedule.FrequencyRecurrenceFactor = 1
schedule.FrequencyInterval = Convert.ToInt32("0x001", 16)
' Set the value of Hostname that defines the data partition.
partition = New MergePartition()
partition.DynamicFilterHostName = hostname
snapshotAgentJob = New MergeDynamicSnapshotJob()
snapshotAgentJob.DynamicFilterHostName = hostname
' Create the partition for the publication with the defined schedule.
publication.AddMergePartition(partition)
publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule)
Else
Throw New ApplicationException(String.Format( _
"Settings could not be retrieved for the publication, " + _
" or the initial snapshot has not been generated. " + _
"Ensure that the publication {0} exists on {1} and " + _
"that the Snapshot Agent has run successfully.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Do error handling here.
Throw New ApplicationException(String.Format( _
"The partition for '{0}' in the {1} publication could not be created.", _
hostname, publicationName), ex)
Finally
publisherConn.Disconnect()
If distributorConn.IsOpen Then
distributorConn.Disconnect()
End If
End Try
W tym przykładzie uruchamia ręcznie agenta migawka wygenerować migawkę filtrowanych danych abonenta do publikacja korespondencji seryjnej z filtrami parametrami wiersza.
// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2008R2";
string publisherName = publisherInstance;
string distributorName = publisherInstance;
SnapshotGenerationAgent agent;
try
{
// Set the required properties for Snapshot Agent.
agent = new SnapshotGenerationAgent();
agent.Distributor = distributorName;
agent.DistributorSecurityMode = SecurityMode.Integrated;
agent.Publisher = publisherName;
agent.PublisherSecurityMode = SecurityMode.Integrated;
agent.Publication = publicationName;
agent.PublisherDatabase = publicationDbName;
agent.ReplicationType = ReplicationType.Merge;
// Specify the partition information to generate a
// filtered snapshot based on Hostname.
agent.DynamicFilterHostName = hostname;
// Start the agent synchronously.
agent.GenerateSnapshot();
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"A snapshot could not be generated for the {0} publication."
, publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2008R2"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance
Dim agent As SnapshotGenerationAgent
Try
' Set the required properties for Snapshot Agent.
agent = New SnapshotGenerationAgent()
agent.Distributor = distributorName
agent.DistributorSecurityMode = SecurityMode.Integrated
agent.Publisher = publisherName
agent.PublisherSecurityMode = SecurityMode.Integrated
agent.Publication = publicationName
agent.PublisherDatabase = publicationDbName
agent.ReplicationType = ReplicationType.Merge
' Specify the partition information to generate a
' filtered snapshot based on Hostname.
agent.DynamicFilterHostName = hostname
' Start the agent synchronously.
agent.GenerateSnapshot()
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"A snapshot could not be generated for the {0} publication." _
, publicationName), ex)
End Try
Zobacz także