Erstellen einer Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Filtern
In diesem Thema wird beschrieben, wie eine Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Filtern in SQL Server 2012 mit SQL Server Management Studio, Transact-SQL oder Replikationsverwaltungsobjekten (RMO) erstellt wird.
In diesem Thema
Vorbereitungen:
Empfehlungen
So erstellen Sie eine Momentaufnahme für eine Mergeveröffentlichung unter Verwendung von parametrisierten Filtern mit:
SQL Server Management Studio
Transact-SQL
Replikationsverwaltungsobjekte (RMO)
Vorbereitungen
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 Erstellen und Anwenden der Anfangsmomentaufnahme. 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 ein Cleanup ausgeführt. Das bedeutet, dass die partitionierte Momentaufnahme schneller abläuft. Bei Verwendung dieser Option sollten Sie möglicherweise zulassen, dass Abonnenten die Momentaufnahmegenerierung und -übermittlung starten. Weitere Informationen zu den Filteroptionen finden Sie im Abschnitt über das Festlegen von Partitionsoptionen unterMomentaufnahmen für Mergeveröffentlichungen mit parametrisierten Filtern.
[Top]
Verwendung von SQL Server Management Studio
Sie können Momentaufnahmen für Partitionen im Dialogfeld Veröffentlichungseigenschaften - <Veröffentlichung> auf der Seite Datenpartitionen generieren. Weitere Informationen zum Zugreifen auf dieses Dialogfeld finden Sie unter Anzeigen und Ändern von Veröffentlichungseigenschaften. 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:
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.
Generieren Sie eine Schemamomentaufnahme für die Veröffentlichung. Es wird standardmäßig eine Schemamomentaufnahme generiert, sobald Sie den Assistenten für neue Veröffentlichung abschließen. Sie können auch eine Schemamomentaufnahme aus SQL Server Management Studio generieren.
So generieren Sie eine Schemamomentaufnahme
Stellen Sie in Management Studio eine Verbindung mit dem Verleger her, und erweitern Sie dann den Serverknoten.
Erweitern Sie den Ordner Replikation, und erweitern Sie dann den Ordner Veröffentlichungen.
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.
Klicken Sie im Dialogfeld Status des Momentaufnahme-Agents anzeigen - <Veröffentlichung> 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
Klicken Sie auf der Seite Datenpartitionen des Dialogfelds Veröffentlichungseigenschaften - <Veröffentlichung> auf Bei Bedarf automatisch eine Partition definieren und eine Momentaufnahme generieren, wenn ein neuer Abonnent zu synchronisieren versucht.
Klicken Sie auf OK.
So generieren und aktualisieren Sie Momentaufnahmen
Klicken Sie auf der Seite Datenpartitionen des Dialogfelds Veröffentlichungseigenschaften – <Veröffentlichung> auf Hinzufügen.
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.
Optional können Sie einen Zeitplan für die Aktualisierung von Momentaufnahmen angeben:
Aktivieren Sie die Option Ausführung des Momentaufnahme-Agents für diese Partition zu folgenden Zeitpunkten planen.
Akzeptieren Sie den Standardzeitplan für die Aktualisierung von Momentaufnahmen, oder klicken Sie auf Ändern, um einen anderen Zeitplan anzugeben.
Klicken Sie auf OK, und Sie gelangen wieder zum Dialogfeld Veröffentlichungseigenschaften - <Veröffentlichung>.
Wählen Sie die Partition im Eigenschaftsraster aus, und klicken Sie anschließend auf Die ausgewählten Momentaufnahmen jetzt generieren.
Klicken Sie auf OK.
[Top]
Verwendung von Transact-SQL
Mithilfe von gespeicherten Prozeduren und dem Momentaufnahme-Agent können Sie folgende Aktionen durchführen:
Anfordern der Momentaufnahmegenerierung und -anwendung durch Abonnenten beim erstmaligen Synchronisieren
Vorabgenerieren von Momentaufnahmen für jede Partition
Manuell eine Momentaufnahme für jeden Abonnenten generieren.
Sicherheitshinweis Die Benutzer sollten nach Möglichkeit während der Laufzeit zur Eingabe von Sicherheitsanmeldeinformationen aufgefordert werden. Wenn Anmeldeinformationen in einer Skriptdatei gespeichert werden müssen, muss die Datei geschützt werden, um unberechtigte Zugriffe zu verhindern.
So erstellen Sie eine Veröffentlichung, die es Abonnenten ermöglicht, die Generierung und Übermittlung von Momentaufnahmen zu initiieren
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank 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_snapshots die 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.
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 Microsoft Windows-Anmeldeinformationen, unter denen der Replikationsmomentaufnahme-Agent ausgeführt wird, für @job_name und @job_password an. Wenn der Agent zum Herstellen der Verbindung mit dem Verleger die SQL Server-Authentifizierung verwendet, müssen Sie zudem 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 Momentaufnahme-Agentauftrag für die Veröffentlichung erstellt. Weitere Informationen dazu, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Erstellen und Anwenden der Anfangsmomentaufnahme.
Sicherheitshinweis 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 zum Datenbankmodul (SQL Server-Konfigurations-Manager).
Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Veröffentlichung 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.
Werden andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert, dann führen Sie sp_addmergefilter (Transact-SQL) aus, um den Join oder die logische Datensatzbeziehung 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.
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
Führen Sie sp_addmergepublication (Transact-SQL) aus, um die Veröffentlichung zu erstellen. Weitere Informationen finden Sie unter Erstellen einer Veröffentlichung.
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_password an. Wenn der Agent zum Herstellen der Verbindung mit dem Verleger die SQL Server-Authentifizierung verwendet, müssen Sie zudem den Wert 0 für @publisher_security_mode und die SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Momentaufnahme-Agentauftrag für die Veröffentlichung erstellt. Weitere Informationen dazu, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Erstellen und Anwenden der Anfangsmomentaufnahme.
Sicherheitshinweis 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 zum Datenbankmodul (SQL Server-Konfigurations-Manager).
Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Veröffentlichung 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.
Werden andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert, dann führen Sie sp_addmergefilter (Transact-SQL) aus, um den Join oder die logische Datensatzbeziehung 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.
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_helpmergepublication (Transact-SQL) aus, wobei Sie für @publication den in Schritt 1 verwendeten Wert angeben. Achten Sie auf den Wert von snapshot_jobid im Resultset.
Konvertieren Sie den in Schritt 5 ermittelten Wert von snapshot_jobid in uniqueidentifier.
Führen Sie auf dem Verleger für die msdb-Datenbank sp_start_job (Transact-SQL) aus, wobei Sie den in Schritt 1 konvertierten Wert für @job_id angeben.
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergepartition (Transact-SQL) aus. Geben Sie den Namen der Veröffentlichung aus Schritt 1 für @publication und den zur Definition der Partition verwendeten Wert entweder für @suser_sname, wenn SUSER_SNAME (Transact-SQL) in der Filterklausel verwendet wird, oder für @host_name an, wenn HOST_NAME (Transact-SQL) in der Filterklausel verwendet wird.
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_adddynamicsnapshot_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. Um den parametrisierten Momentaufnahmeauftrag und seine zugehörige Datenpartition zu entfernen, führen Sie sp_dropdynamicsnapshot_job (Transact-SQL) aus.
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_helpmergepartition (Transact-SQL) aus, und geben Sie den Wert aus Schritt 1 für @publication und den Wert @suser_sname oder @host_name aus Schritt 8 an. Achten Sie auf den Wert von dynamic_snapshot_jobid im Resultset.
Führen Sie auf dem Verteiler für die msdb-Datenbank sp_start_job (Transact-SQL) aus, wobei Sie den in Schritt 9 ermittelten Wert für @job_id angeben. Dadurch wird der parametrisierte Momentaufnahmeauftrag für die Partition gestartet.
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
Führen Sie sp_addmergepublication (Transact-SQL) aus, um die Veröffentlichung zu erstellen. Weitere Informationen finden Sie unter Erstellen einer Veröffentlichung.
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_password an. Wenn der Agent zum Herstellen der Verbindung mit dem Verleger die SQL Server-Authentifizierung verwendet, müssen Sie zudem den Wert 0 für @publisher_security_mode und die SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Momentaufnahme-Agentauftrag für die Veröffentlichung erstellt. Weitere Informationen dazu, wie eine Anfangsmomentaufnahme generiert und ein benutzerdefinierter Zeitplan für den Momentaufnahme-Agent definiert wird, finden Sie unter Erstellen und Anwenden der Anfangsmomentaufnahme.
Sicherheitshinweis 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 zum Datenbankmodul (SQL Server-Konfigurations-Manager).
Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Veröffentlichung 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.
Werden andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert, dann führen Sie sp_addmergefilter (Transact-SQL) aus, um den Join oder die logische Datensatzbeziehung 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.
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 Erstellen und Anwenden der Anfangsmomentaufnahme.
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:
-DynamicFilterHostName – der Wert, wenn HOST_NAME (Transact-SQL) verwendet wird.
-DynamicFilterLogin – der Wert, wenn SUSER_SNAME (Transact-SQL) verwendet wird.
Wiederholen Sie Schritt 8, um für jedes Abonnement eine partitionierte Momentaufnahme zu generieren.
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'AdventureWorks2012';
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 [AdventureWorks2012];
-- Enable AdventureWorks2012 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 AdventureWorks2012.',
@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'AdventureWorks2012';
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 [AdventureWorks2012];
-- Enable AdventureWorks2012 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 AdventureWorks2012.',
@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'AdventureWorks2012';
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 [AdventureWorks2012];
-- Enable AdventureWorks2012 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 AdventureWorks2012.',
@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=AdventureWorks2012
SET PubName=AdvWorksSalesPersonMerge
"C:\Program Files\Microsoft SQL Server\110\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=AdventureWorks2012
SET PubName=AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
MD %SnapshotDir%
"C:\Program Files\Microsoft SQL Server\110\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 = AdventureWorks2012
SET SubDB = AdventureWorks2012Replica
SET PubName = AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
"C:\Program Files\Microsoft SQL Server\110\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
[Top]
Verwenden von Replikationsverwaltungsobjekten (RMO)
Sie können Replikationsverwaltungsobjekte (RMO) verwenden, um partitionierte Momentaufnahmen mit einem der folgenden Verfahren programmgesteuert zu generieren:
Anfordern der Momentaufnahmegenerierung und -anwendung durch Abonnenten beim erstmaligen Synchronisieren
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 NonOverlappingSingleSubscription für 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 Parametrisierte Zeilenfilter. |
Sicherheitshinweis |
---|
Benutzer sollten nach Möglichkeit dazu aufgefordert werden, Anmeldeinformationen zur Laufzeit einzugeben. Wenn Sie Anmeldeinformationen speichern müssen, verwenden Sie die Kryptografiedienste von Microsoft Windows .NET Framework. |
So erstellen Sie eine Veröffentlichung, die es Abonnenten ermöglicht, die Generierung und Übermittlung von Momentaufnahmen zu initiieren
Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection-Klasse verwenden.
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. Wenn LoadProperties den Wert false zurückgibt, vergewissern Sie sich, dass die Datenbank vorhanden ist.
Wenn die EnabledMergePublishing-Eigenschaft false lautet, legen Sie sie auf true fest, und rufen Sie CommitPropertyChanges auf.
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 MaxConcurrentDynamicSnapshots ausgefü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 des bitweisen logischen ODER (| in Visual C# und Or in Visual Basic)-Operatoren, um den Wert Attributes zu AllowSubscriberInitiatedSnapshot hinzuzufügen.
Die Felder Login und Password von SnapshotGenerationAgentProcessSecurity, um die Anmeldeinformationen für das Microsoft Windows-Konto bereitzustellen, unter dem der Momentaufnahme-Agentauftrag ausgeführt wird.
Hinweis Wenn die Veröffentlichung von einem Mitglied der festen Serverrolle sysadmin erstellt wird, empfiehlt es sich, SnapshotGenerationAgentProcessSecurity festzulegen. Weitere Informationen finden Sie unter Sicherheitsmodell des Replikations-Agents.
Rufen Sie die Create-Methode auf, um die Veröffentlichung zu erstellen.
Sicherheitshinweis Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Eigenschaften einschließlich SnapshotGenerationAgentProcessSecurity 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 die Create-Methode aufrufen. Weitere Informationen finden Sie unter Aktivieren von verschlüsselten Verbindungen zum Datenbankmodul (SQL Server-Konfigurations-Manager).
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.
Wenn der Wert für SnapshotAgentExists auf false lautet, rufen Sie CreateSnapshotAgent auf, um den Agentauftrag für die Anfangsmomentaufnahme dieser Veröffentlichung zu erstellen.
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 Erstellen und Anwenden der Anfangsmomentaufnahme.
(Optional) Kontrollieren Sie, wann die SnapshotAvailable-Eigenschaft auf true lautet, um zu ermitteln, wann die Anfangsmomentaufnahme verwendet werden kann.
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
Verwenden Sie eine Instanz der MergePublication-Klasse, um eine Mergeveröffentlichung zu definieren. Weitere Informationen finden Sie unter Erstellen einer Veröffentlichung.
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.
Wenn der Wert für SnapshotAgentExists false lautet, rufen Sie CreateSnapshotAgent auf, um den Agentauftrag für die Momentaufnahme dieser Veröffentlichung zu erstellen.
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.
Kontrollieren Sie, wann die SnapshotAvailable-Eigenschaft true lautet, um zu ermitteln, wann die Anfangsmomentaufnahme verwendet werden kann.
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:
Wenn die Partition des Abonnenten durch das Ergebnis von SUSER_SNAME (Transact-SQL) definiert wird, verwenden Sie DynamicFilterLogin.
Wenn die Partition des Abonnenten durch das Ergebnis von HOST_NAME (Transact-SQL) oder einer Überladung dieser Funktion definiert wird, verwenden Sie DynamicFilterHostName.
Erstellen Sie eine Instanz der MergeDynamicSnapshotJob-Klasse, und legen Sie dieselbe Eigenschaft wie in Schritt 6 fest.
Verwenden Sie die ReplicationAgentSchedule-Klasse, um einen Zeitplan für die Generierung der gefilterten Momentaufnahme für die Abonnentenpartition zu definieren.
Rufen Sie mithilfe der Instanz von MergePublication aus Schritt 1 AddMergePartition auf. Übergeben Sie das MergePartition-Objekt aus Schritt 6.
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.
Rufen Sie EnumMergeDynamicSnapshotJobs auf, und suchen Sie im zurückgegebenen Array nach dem MergeDynamicSnapshotJob-Objekt für den neu hinzugefügten Auftrag für die partitionierte Momentaufnahme.
Rufen Sie die Name-Eigenschaft für den Auftrag ab.
Erstellen Sie eine Verbindung zum Verteiler, indem Sie die ServerConnection-Klasse verwenden.
Erstellen Sie eine Instanz der Server-Klasse für SQL Server Management Objects (SMO), indem Sie das ServerConnection-Objekt aus Schritt 13 übergeben.
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.
Rufen Sie die Start-Methode auf, um den Auftrag für die partitionierte Momentaufnahme zu starten.
Wiederholen Sie die Schritte 6 bis 16 für jeden Abonnenten.
So erstellen Sie eine Veröffentlichung und für jede Partition manuell Momentaufnahmen
Verwenden Sie eine Instanz der MergePublication-Klasse, um eine Mergeveröffentlichung zu definieren. Weitere Informationen finden Sie unter Erstellen einer Veröffentlichung.
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.
Generieren Sie die Anfangsmomentaufnahme. Weitere Informationen finden Sie unter Erstellen und Anwenden der Anfangsmomentaufnahme.
Erstellen Sie eine Instanz der SnapshotGenerationAgent-Klasse, und legen Sie die folgenden erforderlichen Eigenschaften fest:
Publisher – Den Namen des Verlegers
PublisherDatabase – Den Namen der Veröffentlichungsdatenbank
Publication – Den Namen der Veröffentlichung.
Distributor – Den Namen des Verteilers.
PublisherSecurityMode – Den Wert Integrated, wenn die integrierte Windows-Authentifizierung verwendet werden soll, oder den Wert Standard, wenn die SQL Server-Authentifizierung verwendet werden soll.
DistributorSecurityMode – Den Wert Integrated, wenn die integrierte Windows-Authentifizierung verwendet werden soll, oder den Wert Standard, wenn die SQL Server-Authentifizierung verwendet werden soll.
Legen Sie den Wert Merge für ReplicationType fest.
Legen Sie eine oder mehrere der folgenden Eigenschaften fest, um die Partitionierungsparameter zu definieren:
Wenn die Partition des Abonnenten durch das Ergebnis von SUSER_SNAME (Transact-SQL) definiert wird, verwenden Sie DynamicFilterLogin.
Wenn die Partition des Abonnenten durch das Ergebnis von HOST_NAME (Transact-SQL) oder eine Überladung dieser Funktion definiert wird, verwenden Sie DynamicFilterHostName.
Rufen Sie die GenerateSnapshot-Methode auf.
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 = "AdventureWorks2012";
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 = "AdventureWorks2012"
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 = "AdventureWorks2012";
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 = "AdventureWorks2012"
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 = "AdventureWorks2012";
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 = "AdventureWorks2012"
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
[Top]
Siehe auch
Konzepte
Konzepte für gespeicherte Systemprozeduren für die Replikation
Momentaufnahmen für Mergeveröffentlichungen mit parametrisierten Filtern