Udostępnij za pośrednictwem


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.

Uwaga dotycząca zabezpieczeńUwaga dotycząca zabezpieczeń

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

  1. Tworzenie połączenia do Wydawca za pomocą ServerConnection klasy

  2. 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.

  3. If EnabledMergePublishing property is false, zestaw it to true and call CommitPropertyChanges.

  4. 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.

  5. Wywołanie Create metoda tworzenia publikacja.

    Uwaga dotycząca zabezpieczeń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.

  6. 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).

  7. Jeśli wartość SnapshotAgentExists jest false, call CreateSnapshotAgent utworzyć zadanie agenta migawki początkowego dla publikacja.

  8. 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).

  9. (Opcjonalnie) Sprawdź, czy wartość true dla SnapshotAvailable właściwość w celu określenia, kiedy migawka początkowa jest gotowy do użycia.

  10. 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

  1. Użyj wystąpienie z MergePublication klasy do definiowania publikacja korespondencji seryjnej.Aby uzyskać więcej informacji, zobacz Jak Tworzenie publikacji (Programowanie RMO).

  2. 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).

  3. Jeśli wartość SnapshotAgentExists jest false, call CreateSnapshotAgent utworzyć zadanie agenta migawka dla publikacja.

  4. 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).

  5. Sprawdź, czy wartość true dla SnapshotAvailable właściwość w celu określenia, kiedy migawka początkowa jest gotowy do użycia.

  6. 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:

  7. Utworzenie wystąpienie MergeDynamicSnapshotJob klasy, a zestaw tej samej właściwości w kroku 6.

  8. Użyj ReplicationAgentSchedule klasy ustalanie harmonogramu generowania filtrowane migawka dla partycji subskrybenta.

  9. Przy użyciu wystąpienie MergePublication z kroku 1, wywołanie AddMergePartition.Przekazywanie MergePartition obiekt z kroku 6.

  10. 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.

  11. Wywołanie EnumMergeDynamicSnapshotJobsi zlokalizuj MergeDynamicSnapshotJob obiektu zadanie nowo dodane partycjonowana migawka w zwróconej tablicy.

  12. Pobierz Name właściwość dla zadanie.

  13. Tworzenie połączenia do dystrybutora za pomocą ServerConnection klasy

  14. Tworzenie wystąpienie obiekty SMO (SQL Server Management obiektów) Server klasy, przekazując ServerConnection obiekt z kroku 13.

  15. Utworzenie wystąpienie Job klasy, przekazując JobServer Właściwość Server obiekt z kroku 14 i nazwa zadanie z kroku 12.

  16. Wywołanie Start metoda, aby uruchomić zadanie partycjonowana migawka.

  17. Powtórz kroki 6-16 dla każdego subskrybenta.

Tworzenie publikacja i ręcznie tworzyć migawek dla każdej partycji

  1. Użyj wystąpienie z MergePublication klasy do definiowania publikacja korespondencji seryjnej.Aby uzyskać więcej informacji, zobacz Jak Tworzenie publikacji (Programowanie RMO).

  2. 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).

  3. Generowanie migawka początkowa.Aby uzyskać więcej informacji, zobacz Jak Tworzenie migawki początkowego (Programowanie RMO).

  4. Utworzenie wystąpienie SnapshotGenerationAgent klasy, a zestaw następujące wymagane właściwości:

  5. Ustawiona wartość Merge dla ReplicationType.

  6. Ustaw jedną lub więcej z następujących właściwości, aby zdefiniować parametry partycjonowanie:

  7. Wywołanie GenerateSnapshot metoda.

  8. 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