Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln

Gilt für:SQL Server

In diesem Thema wird beschrieben, wie Sie einen Verknüpfungsfilter zwischen Zusammenführungsartikeln in SQL Server mithilfe von SQL Server Management Studio oder Transact-SQL definieren und ändern. Die Mergereplikation unterstützt Joinfilter, die in der Regel in Verbindung mit parametrisierten Filtern verwendet werden, um die Tabellenpartitionierung auf andere verknüpfte Tabellenartikel auszuweiten.

In diesem Thema

Vorbereitungen

Einschränkungen

  • Um einen Joinfilter zu erstellen, muss eine Veröffentlichung mindestens zwei verknüpfte Tabellen enthalten. Verknüpfungsfilterfilter sind eine Erweiterung von Zeilenfiltern. Daher müssen Sie den Zeilenfilter für eine Tabelle definieren, bevor Sie diesen in einer anderen Tabelle um eine Verknüpfung erweitern können. Nach dem Definieren eines Joinfilters können Sie diesen wiederum um einen anderen Joinfilter erweitern, sofern die Veröffentlichung weitere verknüpfte Tabellen enthält.

  • Wenn Sie einen Verknüpfungsfilter hinzufügen, ändern oder löschen, nachdem Abonnements für die Veröffentlichung initialisiert wurden, müssen Sie eine neue Momentaufnahme generieren und alle Abonnements nach vorgenommener Änderung erneut initialisieren. Weitere Informationen zum Ändern von Eigenschaften finden Sie unter Ändern von Veröffentlichungs- und Artikeleigenschaften.

Empfehlungen

Verwendung von SQL Server Management Studio

Definieren, Ändern und Löschen von Verknüpfungsfiltern auf der Seite 'Tabellenzeilen filtern' des Assistenten für neue Publikation oder der Seite 'Filterzeilen ' der Publikationseigenschaften - <Publikationsdialogfeld> . Weitere Informationen zum Verwenden des Assistenten sowie Zugriff auf das Dialogfeld finden Sie unter Erstellen einer Veröffentlichung und Anzeigen und Ändern von Veröffentlichungseigenschaften.

So definieren Sie einen Joinfilter

  1. Wählen Sie auf der Seite 'Tabellenzeilen filtern' des Assistenten 'Neue Publikation' oder der Seite 'Filterzeilen' der Publikationseigenschaften – <Publikation> einen vorhandenen Zeilenfilter oder Verknüpfungsfilter im Bereich 'Gefilterte Tabellen' aus.

  2. Klicken Sie auf Hinzufügenund anschließend auf Join hinzufügen, um den ausgewählten Filter zu erweitern.

  3. Erstellen Sie die Joinanweisung: Aktivieren Sie dazu entweder Anweisung mit dem Generator erstellen oder Joinanweisung manuell schreiben.

    • Wenn Sie auswählen, dass der Generator verwendet werden soll, verwenden Sie die Spalten im Raster (Konjunktion, Gefilterte Tabellenspalte, Operatorund Verknüpfte Tabellenspalte), um eine Joinanweisung zu erstellen.

      Jede Spalte im Raster enthält ein Dropdown-Kombinationsfeld, mit dem Sie zwei Spalten und einen Operator (=,<<> =, =, <>=, >usw.) auswählen können. Die Ergebnisse werden im Textbereich Vorschau angezeigt. Wenn sich der Join auf mehr als ein Spaltenpaar bezieht, wählen Sie in der Konjunktion -Spalte eine Konjunktion aus (AND oder OR), und geben Sie dann zwei weitere Spalten und einen Operator ein.

    • Wenn Sie ausgewählt haben, dass die Anweisung manuell geschrieben wird, schreiben Sie die Joinanweisung im Textbereich Joinanweisung . Ziehen Sie die gewünschten Spalten aus den Listenfeldern Spalten der gefilterten Tabelle und Spalten der verknüpften Tabelle in den Textbereich Joinanweisung .

    • Die vollständige Joinanweisung würde wie folgt aussehen:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]  
      

      Die JOIN-Klausel muss zweiteilige Benennungen verwenden. Drei- und vierteilige Benennungen werden nicht unterstützt.

  4. Geben Sie die Joinoptionen an:

    • Falls die Spalte, die mit der gefilterten Tabelle (der übergeordneten Tabelle) verknüpft wird, eindeutig ist, aktivieren Sie die Option Unique key.

      Achtung

      Durch Auswahl dieser Option kennzeichnen Sie, ob es sich bei der Beziehung zwischen der untergeordneten und der übergeordneten Tabelle in einem Joinfilter um eine 1:1- oder eine 1:n-Beziehung handelt. Verwenden Sie diese Option nur, wenn für die verknüpfte Spalte in der untergeordneten Tabelle eine Einschränkung vorhanden ist, die die Eindeutigkeit sicherstellt. Wenn die Option nicht richtig festgelegt wird, kann eine mangelnde Konvergenz der Daten die Folge sein.

    • Standardmäßig werden Änderungen durch die Mergereplikation während der Synchronisierung zeilenweise verarbeitet. Wenn verwandte Änderungen in Zeilen der gefilterten Tabelle und der verknüpften Tabelle als Einheit verarbeitet werden sollen, wählen Sie nur logischen Datensatz (Microsoft SQL Server 2005 (9.x) und höhere Versionen aus. Diese Option ist nur verfügbar, wenn die Anforderungen für die Verwendung logischer Datensätze durch den Artikel und die Veröffentlichung erfüllt werden. Weitere Informationen finden Sie im Abschnitt „Überlegungen zum Verwenden logischer Datensätze“ unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

  5. Klickan Sie auf OK.

  6. Wenn Sie sich im Dialogfeld "Publikationseigenschaften <- Publikation>" befinden, klicken Sie auf "OK", um das Dialogfeld zu speichern und zu schließen.

So ändern Sie einen Joinfilter

  1. Wählen Sie auf der Seite 'Tabellenzeilen filtern' des Assistenten 'Neue Publikation' oder der Seite 'Zeilen filtern ' der Publikationseigenschaften - <Publikation> einen Filter im Bereich 'Gefilterte Tabellen' aus, und klicken Sie dann auf ' Bearbeiten'.

  2. Ändern Sie den Filter im Dialogfeld Join bearbeiten .

  3. Klickan Sie auf OK.

So löschen Sie einen Joinfilter

  1. Wählen Sie auf der Seite "Tabellenzeilen filtern" des Assistenten für neue Publikation oder auf der Seite "Zeilen filtern" der Publikationseigenschaften - <Publikation> einen Filter im Bereich "Gefilterte Tabellen" aus, und klicken Sie dann auf "Löschen". Wenn der Joinfilter, den Sie löschen möchten, mit anderen Joins erweitert ist, werden diese Joins beim Löschen des Filters selbst ebenfalls gelöscht.

Verwenden von Transact-SQL

In diesen Prozeduren wird ein parametrisierter Filter für einen übergeordneten Artikel mit Verknüpfungsfiltern zwischen diesem Artikel und zugehörigen untergeordneten Artikeln gezeigt. Joinfilter können mithilfe gespeicherter Replikationsprozeduren programmgesteuert definiert und geändert werden.

So definieren Sie einen Joinfilter, um einen Artikelfilter auf zugehörige Artikel in einer Mergeveröffentlichung zu erweitern

  1. Definieren Sie die Filterung für den Artikel, zu dem ein Join hergestellt werden soll. Dieser Artikel wird auch als übergeordneter Artikel bezeichnet.

  2. Führen Sie im Publisher in der Publikationsdatenbank sp_addmergearticle (Transact-SQL) aus, um einen oder mehrere verwandte Artikel zu definieren, die auch als untergeordnete Artikel bezeichnet werden, für die Publikation. Weitere Informationen finden Sie unter Definieren eines Artikels.

  3. Führen Sie im Publisher in der Publikationsdatenbank sp_addmergefilter (Transact-SQL) aus. Geben Sie @publication, einen eindeutigen Namen für diesen Filter für @filtername, den Namen des in Schritt 2 erstellten untergeordneten Artikels für @article, den Namen des übergeordneten Artikels, mit dem ein Join hergestellt wird, für @join_articlename und einen der folgenden Werte für @join_unique_key an:

    • 0 – gibt einen n:1- oder einen n:n-Join zwischen den übergeordneten und den untergeordneten Artikeln an.

    • 1 – gibt einen 1:1- oder einen 1:n-Join zwischen den übergeordneten und den untergeordneten Artikeln an.

    Damit wird ein Joinfilter zwischen den beiden Artikeln definiert.

    Achtung

    Legen Sie @join_unique_key nur dann auf 1 fest, wenn eine Einschränkung für die verknüpfte Spalte in der zugrunde liegenden Tabelle für den übergeordneten Artikel vorliegt, die die Eindeutigkeit sicherstellt. Wird @join_unique_key fälschlicherweise auf 1 festgelegt, kann dies zu einer Nichtkonvergenz der Daten führen.

Beispiele (Transact-SQL)

In diesem Beispiel wird ein Artikel für eine Mergeveröffentlichung definiert, bei der der SalesOrderDetail -Tabellenartikel anhand der SalesOrderHeader -Tabelle gefiltert wird, dies selbst mithilfe eines statischen Zeilenfilters gefiltert wird. Weitere Informationen finden Sie unter Definieren oder Ändern eines statischen Zeilenfilters.

DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

In diesem Beispiel wird eine Gruppe von Artikeln in einer Mergeveröffentlichung definiert, bei der die Artikel mit einer Reihe von Verknüpfungsfiltern anhand der Employee -Tabelle gefiltert werden, die selbst mithilfe eines parametrisierten Zeilenfilters für den Wert HOST_NAME in der LoginID -Spalte gefiltert wird. Weitere Informationen finden Sie unter Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel.

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

Weitere Informationen

Verknüpfungsfilter
Parameterized Row Filters
Ändern von Veröffentlichungs- und Artikeleigenschaften
Filtern veröffentlichter Daten für die Mergereplikation
So wird`s gemacht: definieren und ändern Sie einen Verknüpfungsfilter zwischen Mergeartikeln (SQL Server Management Studio)
Replication System Stored Procedures Concepts
Definieren einer logische Datensatzbeziehung zwischen Mergetabellenartikeln
Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel