Erstellen einer Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Filtern

Gilt für:SQL Server

In diesem Thema wird beschrieben, wie Sie eine Momentaufnahme für eine Zusammenführungsveröffentlichung mit parametrisierten Filtern in SQL Server mithilfe von SQL Server Management Studio, Transact-SQL oder Replication Management Objects (RMO) erstellen.

Wenn parametrisierte Zeilenfilter in Mergeveröffentlichungen verwendet werden, wird jedes Abonnement bei der Replikation mit einer zweiteiligen Momentaufnahme initialisiert. Zuerst wird eine Schemamomentaufnahme erstellt, die alle von der Replikation benötigten Objekte und das Schema der veröffentlichten Objekte enthält, nicht jedoch die Daten. Jedes Abonnement wird dann mit einer Momentaufnahme initialisiert, die die Objekte und das Schema aus der Schemamomentaufnahme sowie die Daten enthält, die zur Partition des Abonnements gehören. Wenn mehrere Abonnements eine bestimmte Partition erhalten (anders ausgedrückt, sie erhalten dasselbe Schema und dieselben Daten), wird die Momentaufnahme für diese Partition nur einmal erstellt. Mehrere Abonnements werden mit derselben Momentaufnahme initialisiert. Weitere Informationen zu parametrisierten Zeilenfiltern finden Sie unter Parameterized Row Filters.

Es gibt drei Methoden zum Erstellen von Momentaufnahmen für Veröffentlichungen mit parametrisierten Filtern:

  • Vorabgenerieren von Momentaufnahmen für jede Partition. Bei dieser Methode können Sie steuern, wann Momentaufnahmen generiert werden.
    Sie haben auch die Möglichkeit, die Momentaufnahmen nach einem Zeitplan zu aktualisieren. Wenn neue Abonnenten eine Partition abonnieren, für die eine Momentaufnahme erstellt wurde, erhalten sie eine aktuelle Momentaufnahme.

  • Abonnenten das Anfordern der Momentaufnahmegenerierung und -anwendung beim erstmaligen Synchronisieren ermöglichen. Mit dieser Option können neue Abonnenten synchronisiert werden, ohne dass ein Administrator eingreifen muss (SQL Server-Agent müssen beim Publisher ausgeführt werden, damit die Momentaufnahme generiert werden können).

    Hinweis

    Wenn das Filtern nach einem oder mehreren Artikeln in der Veröffentlichung nicht überlappende Partitionen ergibt, die für jedes Abonnement eindeutig sind, wird für Metadaten bei jedem Ausführen des Merge-Agents einen Cleanup ausgeführt. Das bedeutet, dass die partitionierte Momentaufnahme schneller abläuft. Bei dieser Methode sollten Sie zulassen, dass Abonnenten das Generieren und Übermitteln von Momentaufnahmen einleiten. Weitere Informationen zu den Filteroptionen finden Sie unter Parameterized Row Filters.

  • Manuelles Generieren einer Momentaufnahme für jeden Abonnenten mit dem Momentaufnahme-Agent. Der Abonnent muss dann einen Momentaufnahmespeicherort für den Merge-Agent bereitstellen, damit die richtige Momentaufnahme abgerufen und angewendet werden kann.

    Hinweis

    Diese Methode wird aus Gründen der Abwärtskompatibilität unterstützt, lässt jedoch keine FTP-Momentaufnahmefreigaben zu.

Die flexibelste Vorgehensweise besteht in einer Kombination der Methoden der Vorabgenerierung und der vom Abonnenten angeforderten Momentaufnahmen: Momentaufnahmen werden vorab generiert und auf der Basis eines Terminplans (normalerweise nicht während Spitzenzeiten) aktualisiert. Falls jedoch ein Abonnement erstellt wird, das eine neue Partition erfordert, kann ein Abonnent eigene Momentaufnahmen generieren.

Betrachten Sie Adventure Works, das über eine mobile Arbeitsgruppe verfügt, die Lagerbestände an einzelne Geschäfte liefert. Jeder Vertriebsmitarbeiter erhält basierend auf seiner Anmeldung ein Abonnement, das die Daten für das vom jeweiligen Mitarbeiter bediente Geschäft abruft. Der Administrator generiert die Momentaufnahmen vorab und aktualisiert sie jeden Sonntag. Gelegentlich wird dem System ein neuer Benutzer hinzugefügt, der Daten für eine Partition benötigt, für die noch keine Momentaufnahme verfügbar ist. Um zu verhindern, dass ein Abonnent die Veröffentlichung nicht abonnieren kann, weil noch keine Momentaufnahme verfügbar ist, lässt der Administrator vom Abonnenten angeforderte Momentaufnahmen zu. Wenn der neue Abonnenten zum ersten Mal eine Verbindung herstellt, wird die Momentaufnahme für die angegebene Partition generiert und auf den Abonnenten angewendet (SQL Server-Agent muss beim Publisher ausgeführt werden, damit die Momentaufnahme generiert werden können).

Informationen zum Erstellen einer Momentaufnahme für eine Veröffentlichung mit parametrisierten Filtern finden Sie unter Erstellen einer Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Filtern.

Sicherheitseinstellungen für den Momentaufnahme-Agent

Der Momentaufnahme-Agent erstellt für jede Partition Momentaufnahmen. Der Agent wird für vorab generierte Momentaufnahmen und Momentaufnahmen ausgeführt, die vom Abonnenten angefordert werden. Er stellt Verbindungen mit den Anmeldeinformationen her, die beim Erstellen des Auftrags des Momentaufnahme-Agents für die Veröffentlichung angegeben wurden (der Auftrag wird vom Assistenten für neue Veröffentlichung oder von sp_addpublication_snapshoterstellt.) Verwenden Sie sp_changedynamicsnapshot_jobzum Ändern der Anmeldeinformationen. Weitere Informationen finden Sie unter sp_changedynamicMomentaufnahme_job (Transact-SQL).

Empfehlungen

  • Zur Erstellung einer Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Filtern müssen Sie zunächst eine Standardmomentaufnahme (Schemamomentaufnahme) erstellen, die alle veröffentlichten Daten und die Abonnentenmetadaten für das Abonnement enthält. Weitere Informationen finden Sie unter Create and Apply the Initial Snapshot. Nachdem Sie die Schemamomentaufnahme erstellt haben, können Sie den Teil der Momentaufnahme generieren, der die abonnentenspezifische Partition der veröffentlichten Daten enthält.

  • Wenn das Filtern nach einem oder mehreren Artikeln in der Veröffentlichung nicht überlappende Partitionen ergibt, die für jedes Abonnement eindeutig sind, wird für Metadaten bei jedem Ausführen des Merge-Agents einen Cleanup ausgeführt. Das bedeutet, dass die partitionierte Momentaufnahme schneller abläuft. Bei dieser Methode sollten Sie zulassen, dass Abonnenten das Generieren und Übermitteln von Momentaufnahmen einleiten.

Verwendung von SQL Server Management Studio

Generieren Sie Momentaufnahme s für Partitionen auf der Seite "Datenpartitionen" des Dialogfelds "Publikationseigenschaften - <Publikation>". Weitere Informationen zum Zugreifen auf dieses Dialogfeld finden Sie unter View and Modify Publication Properties. Sie können zulassen, dass Abonnenten die Momentaufnahmegenerierung und -übermittlung starten bzw. Momentaufnahmen generieren.

Vor der Generierung von Momentaufnahmen für eine oder mehrere Partitionen müssen Sie folgende Aktionen ausführen:

  1. Erstellen Sie eine Mergeveröffentlichung mit dem Assistenten für neue Veröffentlichung, und geben Sie einen oder mehrere Zeilenfilter auf der Seite Filter hinzufügen an. Weitere Informationen finden Sie unter Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel.

  2. Generieren Sie eine Schemamomentaufnahme für die Veröffentlichung. Standardmäßig wird ein Schema Momentaufnahme generiert, wenn Sie den Assistenten für neue Publikation abgeschlossen haben. Sie können auch ein Schema Momentaufnahme aus SQL Server Management Studio generieren.

So generieren Sie eine Schemamomentaufnahme

  1. Verbinden zum Publisher in Management Studio, und erweitern Sie dann den Serverknoten.

  2. Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Veröffentlichungen .

  3. Klicken Sie mit der rechten Maustaste auf die Veröffentlichung, für die Sie eine Momentaufnahme erstellen möchten, und klicken Sie anschließend auf Status des Momentaufnahme-Agents anzeigen.

  4. Klicken Sie im Dialogfeld "Ansicht Momentaufnahmen-Agent Status – <Publikation>" auf "Start".

    Nachdem der Momentaufnahme-Agent die Momentaufnahme generiert hat, wird eine Meldung angezeigt, die beispielsweise wie folgt lautet: "[100%] Es wurde eine Momentaufnahme mit 17 Artikel(n) generiert".

So lassen Sie zu, dass Abonnenten die Momentaufnahmegenerierung und -übermittlung starten

  1. Wählen Sie auf der Seite "Datenpartitionen" des Dialogfelds "Publikationseigenschaften < " Publikation>" die Option "Partition automatisch definieren" aus, und generieren Sie bei Bedarf eine Momentaufnahme, wenn ein neuer Abonnent versucht, die Synchronisierung zu synchronisieren.

  2. Klickan Sie auf OK.

So generieren und aktualisieren Sie Momentaufnahmen

  1. Klicken Sie auf der Seite 'Datenpartitionen' der Publikationseigenschaften<- Publikationsdialogfeld> auf 'Hinzufügen'.

  2. Geben Sie einen Wert für HOST_NAME() und/oder SUSER_SNAME() ein, der der Partition zugeordnet ist, für die Sie eine Momentaufnahme erstellen möchten.

  3. Optional können Sie einen Zeitplan für das Aktualisieren von Momentaufnahmen angeben:

    1. Aktivieren Sie die Option Ausführung des Momentaufnahme-Agents für diese Partition zu folgenden Zeitpunkten planen.

    2. Akzeptieren Sie den Standardzeitplan für die Aktualisierung von Momentaufnahmen, oder klicken Sie auf Ändern , um einen anderen Zeitplan anzugeben.

  4. Klicken Sie auf 'OK', wodurch Sie zum Dialogfeld 'Publikationseigenschaften' <> zurückgerückt werden.

  5. Wählen Sie die Partition im Eigenschaftsraster aus, und klicken Sie anschließend auf Die ausgewählten Momentaufnahmen jetzt generieren.

  6. Klickan Sie auf OK.

Verwenden von Transact-SQL

Mithilfe von gespeicherten Prozeduren und dem Momentaufnahme-Agent können Sie folgende Aktionen durchführen:

  • Abonnenten das Anfordern der Momentaufnahmegenerierung und -anwendung beim erstmaligen Synchronisieren ermöglichen.

  • Vorabgenerieren von Momentaufnahmen für jede Partition.

  • Manuell eine Momentaufnahme für jeden Abonnenten generieren.

    Wichtig

    Benutzer sollten nach Möglichkeit dazu aufgefordert werden, Anmeldeinformationen zur Laufzeit anzugeben. Wenn Anmeldeinformationen in einer Skriptdatei gespeichert werden müssen, muss die Datei an einem sicheren Ort gespeichert werden, um unberechtigten Zugriff zu vermeiden.

So erstellen Sie eine Veröffentlichung, die es Abonnenten ermöglicht, die Generierung und Übermittlung von Momentaufnahmen zu initiieren

  1. Führen Sie im Publisher in der Publikationsdatenbank sp_addmergepublication (Transact-SQL) aus. Geben Sie die folgenden Parameter an:

    • Den Namen der Veröffentlichung für @publication.

    • Den Wert true für @allow_subscriber_initiated_snapshot, wodurch es Abonnenten ermöglicht wird, den Momentaufnahmeprozess zu initiieren.

    • (Optional) Für @max_concurrent_dynamic_snapshotsdie Anzahl dynamischer Momentaufnahmeprozesse, die gleichzeitig ausgeführt werden können. Wird die maximale Anzahl von Prozessen ausgeführt, wenn ein Abonnent versucht, eine Momentaufnahme zu generieren, wird der Prozess in eine Warteschlange eingefügt. Standardmäßig gibt es für die Anzahl gleichzeitig ausgeführter Prozesse keine Beschränkung.

  2. Führen Sie auf dem Verleger sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie den in Schritt 1 für @publication verwendeten Publikationsnamen und die Microsoft Windows-Anmeldeinformationen an, unter denen die Replikation Momentaufnahmen-Agent für @job_login und @password ausgeführt wird. Wenn der Agent sql Server-Authentifizierung beim Herstellen einer Verbindung mit Publisher verwendet, müssen Sie auch den Wert 0 für @publisher_security_mode und die Microsoft SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Auftrag des Momentaufnahme-Agents für die Veröffentlichung erstellt. Weitere Informationen darüber, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Create and Apply the Initial Snapshot.

    Wichtig

    Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter, einschließlich job_login und job_password, bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Aktivieren von verschlüsselten Verbindungen zur Datenbank-Engine (SQL Server-Konfigurations-Manager).

  3. Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Publikation Artikel hinzuzufügen. Diese gespeicherte Prozedur muss einmal für jeden Artikel in der Veröffentlichung ausgeführt werden. Wenn Sie parametrisierte Filter verwenden, müssen Sie mithilfe des Parameters @subset_filterclause einen parametrisierten Filter für einen oder mehrere Artikel angeben. Weitere Informationen finden Sie unter Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel.

  4. Wenn andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert werden, führen Sie sp_addmergefilter (Transact-SQL) aus, um die Verknüpfungs- oder logischen Datensatzbeziehungen zwischen Artikeln zu definieren. Diese gespeicherte Prozedur muss einmal für jede zu definierende Beziehung ausgeführt werden. Weitere Informationen finden Sie unter Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln.

  5. Wenn der Merge-Agent die Momentaufnahme zur Initialisierung des Abonnenten anfordert, wird die Momentaufnahme für die anfordernde Partition des Abonnements automatisch generiert.

So erstellen Sie eine Veröffentlichung, und generieren vorab Momentaufnahmen oder aktualisieren sie automatisch

  1. Führen Sie sp_addmergepublication (Transact-SQL) aus, um die Publikation zu erstellen. Weitere Informationen finden Sie unter Create a Publication.

  2. Führen Sie auf dem Verleger sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie den in Schritt 1 verwendeten Veröffentlichungsnamen für @publication und die Windows-Anmeldeinformationen, unter denen der Momentaufnahme-Agent ausgeführt wird, für @job_name und @job_passwordan. Wenn der Agent sql Server-Authentifizierung beim Herstellen einer Verbindung mit Publisher verwendet, müssen Sie auch einen Wert von 0 für @publisher_security_mode und die SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Auftrag des Momentaufnahme-Agents für die Veröffentlichung erstellt. Weitere Informationen darüber, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Create and Apply the Initial Snapshot.

    Wichtig

    Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter, einschließlich job_login und job_password, bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Aktivieren von verschlüsselten Verbindungen zur Datenbank-Engine (SQL Server-Konfigurations-Manager).

  3. Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Publikation Artikel hinzuzufügen. Diese gespeicherte Prozedur muss einmal für jeden Artikel in der Veröffentlichung ausgeführt werden. Wenn Sie parametrisierte Filter verwenden, müssen Sie mithilfe des Parameters @subset_filterclause einen parametrisierten Filter für einen Artikel angeben. Weitere Informationen finden Sie unter Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel.

  4. Wenn andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert werden, führen Sie sp_addmergefilter (Transact-SQL) aus, um die Verknüpfungs- oder logischen Datensatzbeziehungen zwischen Artikeln zu definieren. Diese gespeicherte Prozedur muss einmal für jede zu definierende Beziehung ausgeführt werden. Weitere Informationen finden Sie unter Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln.

  5. Führen Sie in Publisher in der Publikationsdatenbank sp_helpmergepublication (Transact-SQL) aus, und geben Sie den Wert von @publication aus Schritt 1 an. Achten Sie auf den Wert von snapshot_jobid im Resultset.

  6. Konvertieren Sie den in Schritt 5 ermittelten Wert von snapshot_jobid in uniqueidentifier.

  7. Führen Sie in publisher in der msdb-Datenbank sp_start_job (Transact-SQL) aus, und geben Sie den in Schritt 6 für @job_id abgerufenen konvertierten Wert an.

  8. Führen Sie im Publisher in der Publikationsdatenbank sp_addmergepartition (Transact-SQL) aus. Geben Sie den Namen der Publikation aus Schritt 1 für @publication und den Wert an, der zum Definieren der Partition für @suser_sname verwendet wird, wenn SUSER_SNAME (Transact-SQL) in der Filterklausel oder für @host_name verwendet wird, wenn HOST_NAME (Transact-SQL) in der Filterklausel verwendet wird.

  9. Führen Sie beim Herausgeber in der Publikationsdatenbank sp_adddynamicMomentaufnahme_job (Transact-SQL) aus. Geben Sie den Namen der Veröffentlichung aus Schritt 1 für @publication, den Wert aus Schritt 8 für @suser_sname oder @host_name sowie einen Zeitplan für den Auftrag an. Dadurch wird der Auftrag erstellt, der die parametrisierte Momentaufnahme für die angegebene Partition generiert. Weitere Informationen finden Sie unter Angeben von Synchronisierungszeitplänen.

    Hinweis

    Dieser Auftrag wird mit dem gleichen Windows-Konto ausgeführt wie der in Schritt 2 definierte Anfangs-Momentaufnahmeauftrag. Führen Sie sp_dropdynamicMomentaufnahme_job (Transact-SQL) aus, um den parametrisierten Momentaufnahme Auftrag und die zugehörige Datenpartition zu entfernen.

  10. Führen Sie in publisher in der Publikationsdatenbank sp_helpmergepartition (Transact-SQL) aus, und geben Sie den Wert @publication aus Schritt 1 und den Wert von @suser_sname oder @host_name aus Schritt 8 an. Achten Sie auf den Wert von dynamic_snapshot_jobid im Resultset.

  11. Führen Sie beim Distributor in der msdb-Datenbank sp_start_job (Transact-SQL) aus, und geben Sie den in Schritt 9 für @job_id abgerufenen Wert an. Dadurch wird der parametrisierte Momentaufnahmeauftrag für die Partition gestartet.

  12. Wiederholen Sie die Schritte 8 bis 11, um für jedes Abonnement eine partitionierte Momentaufnahme zu generieren.

So erstellen Sie eine Veröffentlichung und für jede Partition manuell Momentaufnahmen

  1. Führen Sie sp_addmergepublication (Transact-SQL) aus, um die Publikation zu erstellen. Weitere Informationen finden Sie unter Create a Publication.

  2. Führen Sie auf dem Verleger sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie den in Schritt 1 verwendeten Veröffentlichungsnamen für @publication und die Windows-Anmeldeinformationen, unter denen der Momentaufnahme-Agent ausgeführt wird, für @job_name und @job_passwordan. Wenn der Agent sql Server-Authentifizierung beim Herstellen einer Verbindung mit Publisher verwendet, müssen Sie auch einen Wert von 0 für @publisher_security_mode und die SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Auftrag des Momentaufnahme-Agents für die Veröffentlichung erstellt. Weitere Informationen darüber, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Create and Apply the Initial Snapshot.

    Wichtig

    Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter, einschließlich job_login und job_password, bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Aktivieren von verschlüsselten Verbindungen zur Datenbank-Engine (SQL Server-Konfigurations-Manager).

  3. Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Publikation Artikel hinzuzufügen. Diese gespeicherte Prozedur muss einmal für jeden Artikel in der Veröffentlichung ausgeführt werden. Wenn Sie parametrisierte Filter verwenden, müssen Sie mithilfe des Parameters @subset_filterclause einen parametrisierten Filter für zumindest einen Artikel angeben. Weitere Informationen finden Sie unter Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel.

  4. Wenn andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert werden, führen Sie sp_addmergefilter (Transact-SQL) aus, um die Verknüpfungs- oder logischen Datensatzbeziehungen zwischen Artikeln zu definieren. Diese gespeicherte Prozedur muss einmal für jede zu definierende Beziehung ausgeführt werden. Weitere Informationen finden Sie unter Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln.

  5. Starten Sie den Momentaufnahmeauftrag oder führen Sie den Replikationsmomentaufnahme-Agent von der Eingabeaufforderung aus, um das Standard-Momentaufnahmeschema und andere Dateien zu erzeugen. Weitere Informationen finden Sie unter Create and Apply the Initial Snapshot.

  6. Führen Sie den Replikationsmomentaufnahme-Agent erneut von der Eingabeaufforderung aus, um BCP-Dateien (Massenkopierdateien) zu erstellen, wobei Sie den Speicherort der partionierten Momentaufnahme für -DynamicSnapshotLocation und eine oder beide der folgenden Eigenschaften zur Definition der Partition angeben:

  7. Wiederholen Sie Schritt 8, um für jedes Abonnement eine partitionierte Momentaufnahme zu generieren.

  8. Führen Sie den Merge-Agent für jedes Abonnement aus, um die partitionierte Anfangsmomentaufnahme auf die Abonnenten anzuwenden, wobei Sie die folgenden Eigenschaften angeben:

    • -Hostname – der zur Definition der Partition verwendete Wert, wenn der tatsächliche Wert von HOST_NAME überschrieben wurde.

    • -DynamicSnapshotLocation – der Speicherort der dynamischen Momentaufnahme für diese Partition.

Hinweis

Weitere Informationen zur Programmierung von Replikations-Agents finden Sie unter Ausführbare Konzepte für die Programmierung von Replikations-Agents.

Beispiele (Transact-SQL)

In diesem Beispiel wird eine Mergeveröffentlichung mit parametrisierten Filtern erstellt, bei der die Abonnenten den Momentaufnahmegenerierungsprozess initiieren. Die Werte für @job_login und @job_password werden mithilfe von Skriptvariablen übergeben.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. 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".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

In diesem Beispiel wird eine Mergeveröffentlichung mit parametrisierten Filtern erstellt, bei der die Partition jedes Abonnenten durch Ausführung von sp_addmergepartition definiert wird, und der gefilterte Momentaufnahmeauftrag durch Ausführung von sp_adddynamicsnapshot_job unter Angabe der Partitionierungsinformationen erstellt wird. Die Werte für @job_login und @job_password werden mithilfe von Skriptvariablen übergeben.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. 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".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- Create a new snapshot job for the publication, using the 
-- default schedule. Pass credentials at runtime using 
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(Login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains customer information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

PRINT '*** Waiting for the initial snapshot.';
GO

-- Create a temporary table to store the filtered data snapshot 
-- job information.
CREATE TABLE #temp (id int,
    job_name sysname,
    job_id uniqueidentifier,
    dynamic_filter_login sysname NULL,
    dynamic_filter_hostname sysname NULL,
    dynamic_snapshot_location nvarchar(255),
    frequency_type int, 
    frequency_interval int, 
    frequency_subday_type int,
    frequency_subday_interval int, 
    frequency_relative_interval int, 
    frequency_recurrence_factor int, 
    active_start_date int, 
    active_end_date int, 
    active_start_time int, 
    active_end_time int
)

-- Create each snapshot for a partition 
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';

WHILE NOT EXISTS(SELECT * FROM sysmergepublications 
    WHERE [name] = @publication 
    AND snapshot_ready = 1)
BEGIN
    WAITFOR DELAY '00:00:05'
END

-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition 
  @publication = @publication,
  @host_name = @hostname;

-- Create the filtered data snapshot job, and use the returned 
-- information to start the job.
EXEC sp_adddynamicsnapshot_job 
  @publication = @publication,
  @host_name = @hostname;

INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
    dynamic_filter_hostname, dynamic_snapshot_location,
    frequency_type,	frequency_interval, frequency_subday_type,
    frequency_subday_interval, frequency_relative_interval, 
    frequency_recurrence_factor, active_start_date,	active_end_date, 
    active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;

SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);

EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO

In diesem Beispiel wird eine Mergeveröffentlichung mit parametrisierten Filtern erstellt, bei der die Partition und der gefilterte Momentaufnahmeauftrag jedes Abonnenten durch Angabe der Partitionierungsinformationen erstellt wird. Ein Abonnent gibt die Partitionierungsinformationen mithilfe von Befehlszeilenparametern an, wenn die Replikations-Agents manuell ausgeführt werden. In diesem Beispiel wird davon ausgegangen, dass auch ein Abonnement für die Veröffentlichung erstellt wurde.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. 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".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- Create a new snapshot job for the publication, using the 
-- default schedule. Pass credentials at runtime using 
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(Login), 
  @job_password = $(Password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains customer information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO
  
REM Line breaks are added to improve readability.   
REM In a batch file, commands must be made in a single line.  
REM Run the Snapshot agent from the command line to generate the standard snapshot   
REM schema and other files.   
SET DistPub=%computername%  
SET PubDB=AdventureWorks2022   
SET PubName=AdvWorksSalesPersonMerge  
  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %PubName%    
-Publisher %DistPub% -Distributor  %DistPub%  -PublisherDB %PubDB%  -ReplicationType 2    
-OutputVerboseLevel 1  -DistributorSecurityMode 1  
  
PAUSE  
  
  
REM Run the Snapshot agent from the command line, this time to generate   
REM the bulk copy (.bcp) data for each Subscriber partition.    
SET DistPub=%computername%  
SET PubDB=AdventureWorks2022   
SET PubName=AdvWorksSalesPersonMerge  
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando  
  
MD %SnapshotDir%  
  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %PubName%    
-Publisher %DistPub%  -Distributor  %DistPub%  -PublisherDB %PubDB%  -ReplicationType 2    
-OutputVerboseLevel 1  -DistributorSecurityMode 1  -DynamicFilterHostName "adventure-works\Fernando"    
-DynamicSnapshotLocation %SnapshotDir%  
  
PAUSE  
  
  
REM Run the Merge Agent for each subscription to apply the partitioned   
REM snapshot for each Subscriber.    
SET Publisher = %computername%  
SET Subscriber = %computername%  
SET PubDB = AdventureWorks2022   
SET SubDB = AdventureWorks2022Replica   
SET PubName = AdvWorksSalesPersonMerge   
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando  
  
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE" -Publisher  %Publisher%    
-Subscriber  %Subscriber%  -Distributor %Publisher%  -PublisherDB %PubDB%    
-SubscriberDB %SubDB% -Publication %PubName%  -PublisherSecurityMode 1  -OutputVerboseLevel 3    
-Output -SubscriberSecurityMode 1  -SubscriptionType 3 -DistributorSecurityMode 1    
-Hostname "adventure-works\Fernando"  -DynamicSnapshotLocation %SnapshotDir%  
  
PAUSE  
  

Verwenden von Replikationsverwaltungsobjekten (RMO)

Sie können Replikationsverwaltungsobjekte (RMO) verwenden, um partitionierte Momentaufnahmen mit einem der folgenden Verfahren programmgesteuert zu generieren:

  • Abonnenten das Anfordern der Momentaufnahmegenerierung und -anwendung beim erstmaligen Synchronisieren ermöglichen.

  • Vorabgenerieren von Momentaufnahmen für jede Partition.

  • Manuelles Generieren einer Momentaufnahme für jeden Abonnenten durch Ausführen des Momentaufnahme-Agent

Hinweis

Wenn das Filtern für einen Artikel nicht überlappende Partitionen ergibt, die für jedes Abonnement eindeutig sind (durch Angabe des Werts F:Microsoft.SqlServer.Replication.PartitionOptions.NonOverlappingSingleSubscription für P:Microsoft.SqlServer.Replication.MergeArticle.PartitionOption beim Erstellen eines Mergeartikels), werden Metadaten immer dann bereinigt, wenn der Merge-Agent ausgeführt wird. Das bedeutet, dass die partitionierte Momentaufnahme schneller abläuft. Bei dieser Methode sollten Sie zulassen, dass Abonnenten das Generieren von Momentaufnahmen anfordern. Weitere Informationen finden Sie unter "Verwenden der richtigen Filteroptionen" im Thema Parameterized Row Filters.

Wichtig

Benutzer sollten nach Möglichkeit dazu aufgefordert werden, Anmeldeinformationen zur Laufzeit anzugeben. Wenn Sie Anmeldeinformationen speichern müssen, verwenden Sie die kryptografischen Dienste , die vom Microsoft Windows .NET Framework bereitgestellt werden.

So erstellen Sie eine Veröffentlichung, die es Abonnenten ermöglicht, die Generierung und Übermittlung von Momentaufnahmen zu initiieren

  1. Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der ReplicationDatabase -Klasse für die Veröffentlichungsdatenbank, legen Sie die ConnectionContext -Eigenschaft auf die Instanz von ServerConnection aus Schritt 1 fest, und rufen Sie die LoadProperties -Methode auf. If LoadProperties den Wert falsezurückgibt, vergewissern Sie sich, dass die Datenbank vorhanden ist.

  3. If EnabledMergePublishing -Eigenschaft falselautet, legen Sie sie auf true fest, und rufen Sie CommitPropertyChanges.

  4. Erstellen Sie eine Instanz der MergePublication -Klasse, und legen Sie die folgenden Eigenschaften für dieses Objekt fest:

    • Die ServerConnection aus Schritt 1 für ConnectionContext.

    • Den Namen der veröffentlichten Datenbank für DatabaseName.

    • Einen Namen für die Veröffentlichung für Name.

    • Die maximale Anzahl an Aufträgen für dynamische Momentaufnahmen, die für MaxConcurrentDynamicSnapshotsausgeführt werden können. Da von Abonnenten initiierte Momentaufnahmeanforderungen jederzeit erfolgen können, begrenzt diese Eigenschaft die Anzahl der Momentaufnahme-Agentaufträge, die gleichzeitig ausgeführt werden können, wenn mehrere Abonnenten ihre partitionierte Momentaufnahme gleichzeitig anfordern. Wenn die maximale Anzahl an Aufträgen ausgeführt wird, werden weitere Anforderungen für partitionierte Momentaufnahmen in die Warteschlange eingefügt, bis einer der Aufträge abgeschlossen ist.

    • Verwenden Sie einen bitweisen logischen OR-Operator (| in Visual C# und Or in Visual Basic), um AllowSubscriberInitiatedSnapshot den Wert Attributes.

    • Die Login Felder Password für SnapshotGenerationAgentProcessSecurity die Angabe der Anmeldeinformationen für das Microsoft Windows-Konto, unter dem der Momentaufnahmen-Agent Auftrag ausgeführt wird.

      Hinweis

      Wenn die Veröffentlichung von einem Mitglied der festen Serverrolle SnapshotGenerationAgentProcessSecurity erstellt wird, empfiehlt es sich, P:Microsoft.SqlServer.Replication.Publication.SnapshotGenerationAgentProcessSecurity festzulegen. Weitere Informationen finden Sie unter Replication Agent Security Model.

  5. Rufen Sie die Create -Methode auf, um die Veröffentlichung zu erstellen.

    Wichtig

    Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Eigenschaften einschließlich SnapshotGenerationAgentProcessSecuritybereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie die Create-Methode aufrufen. Weitere Informationen finden Sie unter Aktivieren von verschlüsselten Verbindungen zur Datenbank-Engine (SQL Server-Konfigurations-Manager).

  6. Verwenden Sie die MergeArticle -Eigenschaft, um der Veröffentlichung Artikel hinzuzufügen. Geben Sie die FilterClause -Eigenschaft für wenigstens einen Artikel an, der den parametrisierten Filter definiert. (Optional) Erstellen Sie MergeJoinFilter -Objekte, die Joinfilter zwischen Artikeln definieren. Weitere Informationen finden Sie unter Definieren eines Artikels.

  7. Wenn der Wert für SnapshotAgentExists auf falselautet, rufen Sie CreateSnapshotAgent auf, um den Agentauftrag für die Anfangsmomentaufnahme dieser Veröffentlichung zu erstellen.

  8. Rufen Sie die StartSnapshotGenerationAgentJob -Methode des in Schritt 4 erstellten MergePublication -Objekts auf. Dadurch wird der Agentauftrag gestartet, der die Anfangsmomentaufnahme generiert. Weitere Informationen darüber, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Create and Apply the Initial Snapshot.

  9. (Optional) Kontrollieren Sie, wann die true -Eigenschaft auf SnapshotAvailable lautet, um zu ermitteln, wann die Anfangsmomentaufnahme verwendet werden kann.

  10. Wenn der Merge-Agent eines Abonnenten die Verbindung erstmalig herstellt, wird automatisch eine partitionierte Momentaufnahme generiert.

So erstellen Sie eine Veröffentlichung und generieren Momentaufnahmen vorab oder aktualisieren sie automatisch

  1. Verwenden Sie eine Instanz der MergePublication -Klasse, um eine Mergeveröffentlichung zu definieren. Weitere Informationen finden Sie unter Create a Publication.

  2. Verwenden Sie die MergeArticle -Eigenschaft, um der Veröffentlichung Artikel hinzuzufügen. Geben Sie die FilterClause -Eigenschaft für mindestens einen Artikel an, der den parametrisierten Filter definiert, und erstellen Sie beliebige MergeJoinFilter -Objekte, die Joinfilter zwischen Artikeln definieren. Weitere Informationen finden Sie unter Definieren eines Artikels.

  3. Wenn der Wert für SnapshotAgentExists auf falselautet, rufen Sie CreateSnapshotAgent auf, um den Agentauftrag für die Momentaufnahme dieser Veröffentlichung zu erstellen.

  4. Rufen Sie die StartSnapshotGenerationAgentJob -Methode des in Schritt 1 erstellten MergePublication -Objekts auf. Durch diese Methode wird der Agentauftrag gestartet, der die Anfangsmomentaufnahme generiert. Weitere Informationen darüber, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Erstellen und Anwenden der Anfangsmomentaufnahme.

  5. Kontrollieren Sie, wann die true -Eigenschaft auf SnapshotAvailable lautet, um zu ermitteln, wann die Anfangsmomentaufnahme verwendet werden kann.

  6. Erstellen Sie eine Instanz der MergePartition -Klasse, und legen Sie die Kriterien für den parametrisierten Filter des Abonnenten fest, indem Sie eine der folgenden Eigenschaften oder beide verwenden:

  7. Erstellen Sie eine Instanz der MergeDynamicSnapshotJob -Klasse, und legen Sie dieselbe Eigenschaft wie in Schritt 6 fest.

  8. Verwenden Sie die ReplicationAgentSchedule -Klasse, um einen Zeitplan für die Generierung der gefilterten Momentaufnahme für die Abonnentenpartition zu definieren.

  9. Rufen Sie mithilfe der Instanz von MergePublication aus Schritt 1 AddMergePartitionauf. Übergeben Sie das MergePartition -Objekt aus Schritt 6.

  10. Rufen Sie mithilfe der Instanz von MergePublication aus Schritt 1 die AddMergeDynamicSnapshotJob -Methode auf. Übergeben Sie das MergeDynamicSnapshotJob -Objekt aus Schritt 7 und das ReplicationAgentSchedule -Objekt aus Schritt 8.

  11. Rufen Sie EnumMergeDynamicSnapshotJobsauf, und suchen Sie im zurückgegebenen Array nach dem MergeDynamicSnapshotJob -Objekt für den neu hinzugefügten Auftrag für die partitionierte Momentaufnahme.

  12. Rufen Sie die Name -Eigenschaft für den Auftrag ab.

  13. Erstellen Sie eine Verbindung mit dem Verteiler, indem Sie die ServerConnection -Klasse verwenden.

  14. Erstellen Sie eine Instanz der Server -Klasse für SQL Server Management Objects (SMO), indem Sie das ServerConnection -Objekt aus Schritt 13 übergeben.

  15. Erstellen Sie eine Instanz der Job -Klasse, indem Sie die JobServer -Eigenschaft des Server -Objekts aus Schritt 14 und den Auftragnamen aus Schritt 12 übergeben.

  16. Rufen Sie die Start -Methode auf, um den Auftrag für die partitionierte Momentaufnahme zu starten.

  17. Wiederholen Sie die Schritte 6 bis 16 für jeden Abonnenten.

So erstellen Sie eine Veröffentlichung und für jede Partition manuell Momentaufnahmen

  1. Verwenden Sie eine Instanz der MergePublication -Klasse, um eine Mergeveröffentlichung zu definieren. Weitere Informationen finden Sie unter Create a Publication.

  2. Verwenden Sie die MergeArticle -Eigenschaft, um der Veröffentlichung Artikel hinzuzufügen. Geben Sie die FilterClause -Eigenschaft für mindestens einen Artikel an, der den parametrisierten Filter definiert, und erstellen Sie beliebige MergeJoinFilter -Objekte, die Joinfilter zwischen Artikeln definieren. Weitere Informationen finden Sie unter Definieren eines Artikels.

  3. Generieren Sie die Anfangsmomentaufnahme. Weitere Informationen finden Sie unter Create and Apply the Initial Snapshot.

  4. Erstellen Sie eine Instanz der SnapshotGenerationAgent -Klasse, und legen Sie die folgenden erforderlichen Eigenschaften fest:

  5. Legen Sie den Wert Merge für ReplicationTypefest.

  6. Legen Sie eine oder mehrere der folgenden Eigenschaften fest, um die Partitionierungsparameter zu definieren:

  7. Rufen Sie die GenerateSnapshot-Methode auf.

  8. Wiederholen Sie die Schritte 4 - 7 für jeden Abonnenten.

Beispiele (RMO)

In diesem Beispiel wird eine Mergeveröffentlichung erstellt, die es Abonnenten ermöglicht, die Momentaufnahmegenerierung anzufordern.

// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";

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 = "AdventureWorks2022"

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

In diesem Beispiel werden die Abonnentenpartition und die gefilterte Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Zeilenfiltern manuell erstellt.

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
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 = "AdventureWorks2022"
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

In diesem Beispiel wird der Momentaufnahme-Agent manuell gestartet, um die gefilterten Momentaufnahmedaten für den Abonnenten einer Mergeveröffentlichung mit parametrisierten Zeilenfiltern zu generieren.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
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 = "AdventureWorks2022"
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

Weitere Informationen

Parameterized Row Filters
Replication System Stored Procedures Concepts
Bewährte Methoden für die Replikationssicherheit