Vorgehensweise: Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel (Replikationsprogrammierung mit Transact-SQL)

Zum Erstellen von Tabellenartikeln können Sie parametrisierte Zeilenfilter verwenden. In diesen Filtern werden mit einer WHERE-Klausel die zu veröffentlichenden Daten ausgewählt. Statt in der Klausel einen Literalwert anzugeben (wie dies bei statischen Zeilenfiltern der Fall wäre), wird mindestens eine der folgenden Systemfunktionen angegeben: SUSER_SNAME und HOST_NAME. Weitere Informationen zu parametrisierten Zeilenfiltern finden Sie unter Parametrisierte Zeilenfilter. Parametrisierte Zeilenfilter können mithilfe gespeicherter Replikationsprozeduren programmgesteuert erstellt und geändert werden.

So definieren Sie einen parametrisierten Zeilenfilter für einen Artikel in einer Mergeveröffentlichung

  • Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) aus. Geben Sie @publication, einen Namen für den Artikel für @article, die zu veröffentlichende Tabelle für @source_object, die WHERE-Klausel zur Definition des parametrisierten Filters für @subset_filterclause (ohne Angabe von WHERE) und einen der folgenden Werte für @partition_options an, der die Art der Partitionierung beschreibt, die aus dem parametrisierten Filter resultiert:

    • 0 – Der Filtervorgang für den Artikel ist entweder statisch oder ergibt keine eindeutige Teilmenge von Daten für jede Partition (eine "überlappende" Partition).

    • 1 – Die resultierenden Partitionen überlappen sich, und beim Abonnenten vorgenommene Aktualisierungen können nicht zur Änderung der Partition führen, zu der eine Zeile gehört.

    • 2 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen. Mehrere Abonnenten können jedoch die gleiche Partition erhalten.

    • 3 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen, die für jedes Abonnement eindeutig sind.

So ändern Sie einen parametrisierten Zeilenfilter für einen Artikel in einer Mergeveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticle aus. Geben Sie @publication, @article, den Wert subset_filterclause für @property, den Ausdruck zur Definition des parametrisierten Filters für @value (ohne Angabe von WHERE) und den Wert 1 sowohl für @force_invalidate_snapshot als auch für @force_reinit_subscription an.

  2. Wenn diese Änderung zu einem anderem Partitionierungsverhalten führt, dann führen Sie sp_changemergearticle erneut aus. Geben Sie @publication, @article, den Wert partition_options für @property und die am besten geeignete Partitionierungsoption für @value an. Folgende Partitionierungsoptionen können angegeben werden:

    • 0 – Das Filtern für den Artikel ist entweder statisch oder ergibt keine eindeutige Teilmenge von Daten für jede Partition (eine "überlappende" Partition).

    • 1 – Die resultierenden Partitionen überlappen sich, und beim Abonnenten vorgenommene Aktualisierungen können nicht zur Änderung der Partition führen, zu der eine Zeile gehört.

    • 2 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen. Mehrere Abonnenten können jedoch die gleiche Partition erhalten.

    • 3 – Der Filtervorgang für den Artikel ergibt sich nicht überlappende Partitionen, die für jedes Abonnement eindeutig sind.

Beispiel

In diesem Beispiel wird eine Gruppe von Artikeln in einer Mergeveröffentlichung definiert, bei der die Artikel mit einer Reihe von Joinfiltern anhand der Employee-Tabelle gefiltert werden, die selbst mithilfe eines parametrisierten Zeilenfilters in der LoginID-Spalte gefiltert wird. Während der Synchronisierung wird der von der HOST_NAME-Funktion zurückgegebene Wert überschrieben. Weitere Informationen finden Sie im Abschnitt "Überschreiben des HOST_NAME()-Werts" im Thema Parametrisierte Zeilenfilter .

-- 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'AdventureWorks2008R2';
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 [AdventureWorks2008R2];

-- Enable AdventureWorks2008R2 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 AdventureWorks2008R2.', 
  @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