Definieren und Ändern eines Verknüpfungsfilters zwischen MergeartikelnDefine and Modify a Join Filter Between Merge Articles

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions)

In diesem Thema wird beschrieben, wie Verknüpfungsfilter zwischen Mergeartikeln in SQL Server 2019 (15.x)SQL Server 2019 (15.x) mit SQL Server Management StudioSQL Server Management Studio oder Transact-SQLTransact-SQLdefiniert und geändert werden.This topic describes how to define and modify a join filter between merge articles in SQL Server 2019 (15.x)SQL Server 2019 (15.x) by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. 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.Merge replication supports join filters, which are typically used in conjunction with parameterized filters to extend table partitioning to other related table articles.

In diesem ThemaIn This Topic

VorbereitungenBefore You Begin

EinschränkungenLimitations and Restrictions

  • Um einen Joinfilter zu erstellen, muss eine Veröffentlichung mindestens zwei verknüpfte Tabellen enthalten.To create a join filter, a publication must contain at least two related tables. 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.A join filter extends a row filter; therefore you must define a row filter on one table before you can extend the filter with a join to another table. 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.After one join filter is defined, you can extend this join filter with another join filter if the publication contains additional related tables.

  • 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.If you add, modify, or delete a join filter after subscriptions to the publication have been initialized, you must generate a new snapshot and reinitialize all subscriptions after making the change. Weitere Informationen zum Ändern von Eigenschaften finden Sie unter Ändern von Veröffentlichungs- und Artikeleigenschaften.For more information about requirements for property changes, see Change Publication and Article Properties.

EmpfehlungenRecommendations

Verwenden von SQL Server Management StudioUsing SQL Server Management Studio

Definieren, ändern und löschen Sie Verknüpfungsfilter auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Filterzeilen im Dialogfeld Veröffentlichungseigenschaften - <Publication> .Define, modify, and delete join filters on the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box. 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.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

So definieren Sie einen JoinfilterTo define a join filter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Filterzeilen von Veröffentlichungseigenschaften - <Publication> einen vorhandenen Zeilenfilter oder Verknüpfungsfilter im Bereich Gefilterte Tabellen aus.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select an existing row filter or join filter in the Filtered Tables pane.

  2. Klicken Sie auf Hinzufügenund anschließend auf Join hinzufügen, um den ausgewählten Filter zu erweitern.Click Add, and then click Add Join to Extend the Selected Filter.

  3. Erstellen Sie die Joinanweisung: Aktivieren Sie dazu entweder Anweisung mit dem Generator erstellen oder Joinanweisung manuell schreiben.Create the join statement: select either Use the builder to create the statement or Write the join the statement manually.

    • 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.If you select to use the builder, use the columns in the grid (Conjunction, Filtered table column, Operator, and Joined table column) to build a join statement.

      Die Spalten in der Tabelle enthalten jeweils ein Dropdown-Kombinationsfeld, in dem Sie zwei Spalten und einen Operator ( = , <> , <= , <, >= , > und like) auswählen können.Each column in the grid contains a drop-down combo box, allowing you to select two columns and an operator (=, <>, <=, <, >=, >, and like). Die Ergebnisse werden im Textbereich Vorschau angezeigt.The results are displayed in the Preview text area. 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.If the join involves more than one pair of columns, select a conjunction (AND or OR) from the Conjunction column, and then enter two more columns and an operator.

    • Wenn Sie ausgewählt haben, dass die Anweisung manuell geschrieben wird, schreiben Sie die Joinanweisung im Textbereich Joinanweisung .If you select to write the statement manually, write the join statement in the Join statement text area. Ziehen Sie die gewünschten Spalten aus den Listenfeldern Spalten der gefilterten Tabelle und Spalten der verknüpften Tabelle in den Textbereich Joinanweisung .Use the Filtered table columns list box and the Joined table columns list box to drag and drop columns to the Join statement text area.

    • Die vollständige Joinanweisung würde wie folgt aussehen:The complete join statement would appear like:

      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.The JOIN clause should use two-part naming; three-part naming and four-part naming are not supported.

  4. Geben Sie die Joinoptionen an:Specify join options:

    • Falls die Spalte, die mit der gefilterten Tabelle (der übergeordneten Tabelle) verknüpft wird, eindeutig ist, aktivieren Sie die Option Unique key.If the column on which you join in the filtered table (the parent table) is unique, select 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.Selecting this option indicates that the relationship between the child and parent tables in a join filter is one to one or one to many. 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.Only select this option if you have a constraint on the joining column in the child table that guarantees uniqueness. Wenn die Option nicht richtig festgelegt wird, kann eine mangelnde Konvergenz der Daten die Folge sein.If the option is set incorrectly, non-convergence of data can occur.

    • Standardmäßig werden Änderungen durch die Mergereplikation während der Synchronisierung zeilenweise verarbeitet.By default, merge replication processes changes on a row-by-row basis during synchronization. Wenn Änderungen in Zeilen sowohl in der gefilterten Tabelle als auch in der verknüpften Tabelle als eine Einheit verarbeitet werden sollen, aktivieren Sie die Option Logischer Datensatz (nur MicrosoftMicrosoft SQL Server 2005 (9.x)SQL Server 2005 (9.x) und höher).To have related changes in rows of both the filtered table and the joined table processed as a unit, select Logical record (MicrosoftMicrosoft SQL Server 2005 (9.x)SQL Server 2005 (9.x) and later versions only). 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.This option is available only if the article and publication requirements for using logical records are met. 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.For more information see the section "Considerations for Using Logical Records" in Group Changes to Related Rows with Logical Records.

  5. Klicken Sie auf OK.Click OK.

  6. Wenn Sie sich im Dialogfeld Veröffentlichungseigenschaften - <Publication> befinden, klicken Sie auf OK, um die Einstellungen zu speichern und das Dialogfeld zu schließen.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

So ändern Sie einen JoinfilterTo modify a join filter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Filterzeilen von Veröffentlichungseigenschaften - <Publication> einen Filter im Bereich gefilterte Tabellen, und klicken Sie dann auf Bearbeiten.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Edit.

  2. Ändern Sie den Filter im Dialogfeld Join bearbeiten .In the Edit Join dialog box, modify the filter.

  3. Klicken Sie auf OK.Click OK.

So löschen Sie einen JoinfilterTo delete a join filter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder der Seite Filterzeilen von Veröffentlichungseigenschaften - <Publication> einen Filter im Bereich gefilterte Tabellen, und klicken Sie dann auf Löschen.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Delete. 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.If the join filter you delete is itself extended by other joins, those joins will also be deleted.

Verwenden von Transact-SQLUsing 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.These procedures show a parameterized filter on a parent article with join filters between this article and related child articles. Joinfilter können mithilfe gespeicherter Replikationsprozeduren programmgesteuert definiert und geändert werden.Join filters can be defined and modified programmatically using replication stored procedures.

So definieren Sie einen Joinfilter, um einen Artikelfilter auf zugehörige Artikel in einer Mergeveröffentlichung zu erweiternTo define a join filter to extend an article filter to related articles in a merge publication

  1. Definieren Sie die Filterung für den Artikel, zu dem ein Join hergestellt werden soll. Dieser Artikel wird auch als übergeordneter Artikel bezeichnet.Define the filtering for the article being joined to, which is also known as the parent article.

  2. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank, Sp_addmergearticle (Transact-SQL) aus um einen oder mehrere ähnliche Artikel, auch bekannt als untergeordnete Artikel, für die Veröffentlichung zu definieren.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL) to define one or more related articles, which are also known as child articles, for the publication. Weitere Informationen finden Sie unter Definieren eines Artikels.For more information, see Define an Article.

  3. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergefilter (Transact-SQL)aus.At the Publisher on the publication database, execute sp_addmergefilter (Transact-SQL). 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:Specify @publication, a unique name for this filter for @filtername, the name of the child article created in step 2 for @article, the name of the parent article being joined to for @join_articlename, and one of the following values for @join_unique_key:

    • 0 – gibt einen n:1- oder einen n:n-Join zwischen den übergeordneten und den untergeordneten Artikeln an.0 - indicates a many-to-one or many-to-many join between the parent and child articles.

    • 1 – gibt einen 1:1- oder einen 1:n-Join zwischen den übergeordneten und den untergeordneten Artikeln an.1 - indicates a one-to-one or one-to-many join between the parent and child articles.

    Damit wird ein Joinfilter zwischen den beiden Artikeln definiert.This defines a join filter between the two articles.

    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.Only set @join_unique_key to 1 if you have a constraint on the joining column in the underlying table for the parent article that guarantees uniqueness. Wird @join_unique_key fälschlicherweise auf 1 festgelegt, kann dies zu einer Nichtkonvergenz der Daten führen.If @join_unique_key is set to 1 incorrectly, non-convergence of data may occur.

Beispiele (Transact-SQL)Examples (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.This example defines an article for a merge publication, where the SalesOrderDetail table article is filtered against the SalesOrderHeader table that is itself filtered using a static row filter. Weitere Informationen finden Sie unter Definieren oder Ändern eines statischen Zeilenfilters.For more information, see Define and Modify a Static Row Filter.

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.This example defines a group of articles in a merge publication where the articles are filtered with a series of join filters against the Employee table that is itself filtered using a parameterized row filter on the value of HOST_NAME in the LoginID column. Weitere Informationen finden Sie unter Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel.For more information, see Define and Modify a Parameterized Row Filter for a Merge Article.

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

Weitere InformationenSee Also

Join Filters Join Filters
Parameterized Row Filters Parameterized Row Filters
Ändern von Veröffentlichungs- und Artikeleigenschaften Change Publication and Article Properties
Filtern von veröffentlichten Daten für die Mergereplikation Filter Published Data for Merge Replication
Vorgehensweise: Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln (SQL Server Management Studio) How to: Define and Modify a Join Filter Between Merge Articles (SQL Server Management Studio)
Replication System Stored Procedures Concepts Replication System Stored Procedures Concepts
Define a Logical Record Relationship Between Merge Table Articles Define a Logical Record Relationship Between Merge Table Articles
Definieren und Ändern eines parametrisierten Zeilenfilters für einen MergeartikelDefine and Modify a Parameterized Row Filter for a Merge Article