Définir et modifier un filtre de jointure entre des articles de fusionDefine and Modify a Join Filter Between Merge Articles

S’APPLIQUE À : ouiSQL Server nonAzure SQL Database nonAzure Synapse Analytics (SQL DW) nonParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Cette rubrique décrit comment définir et modifier un filtre de jointure entre des articles de fusion dans SQL ServerSQL Server à l'aide de SQL Server Management StudioSQL Server Management Studio ou de Transact-SQLTransact-SQL.This topic describes how to define and modify a join filter between merge articles in SQL ServerSQL Server by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. La réplication de fusion prend en charge les filtres de jointure, qui sont en général utilisés conjointement aux filtres paramétrables pour étendre le partitionnement de table à d'autres articles de table connexes.Merge replication supports join filters, which are typically used in conjunction with parameterized filters to extend table partitioning to other related table articles.

Dans cette rubriqueIn This Topic

Avant de commencerBefore You Begin

Limitations et restrictionsLimitations and Restrictions

  • Pour qu'il soit possible de créer un filtre de jointure, la publication doit contenir au minimum deux tables associées.To create a join filter, a publication must contain at least two related tables. Un filtre de jointure permet d'étendre un filtre de lignes : vous devez donc définir un filtre de lignes sur une table pour pouvoir étendre le filtre à une autre table avec une jointure.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. Après avoir défini un filtre de jointure, vous pouvez l'étendre avec un autre filtre de jointure si la publication contient des tables associées supplémentaires.After one join filter is defined, you can extend this join filter with another join filter if the publication contains additional related tables.

  • Si vous ajoutez, modifiez ou supprimez un filtre de jointure après que les abonnements à la publication aient été initialisés, vous devez générer un nouvel instantané et réinitialiser tous les abonnements après avoir effectué la modification.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. Pour plus d’informations sur les exigences relatives aux changements de propriétés, consultez Changer les propriétés des publications et des articles.For more information about requirements for property changes, see Change Publication and Article Properties.

RecommandationsRecommendations

Utilisation de SQL Server Management StudioUsing SQL Server Management Studio

Définissez, modifiez et supprimez des filtres de jointure dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou dans la page Filtrer les lignes de la boîte de dialogue Propriétés de la publication - <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. Pour plus d’informations sur l’utilisation de l’Assistant et sur l’accès à la boîte de dialogue, consultez Créer une publication et Afficher et modifier les propriétés d’une publication.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

Pour définir un filtre de jointureTo define a join filter

  1. Dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou dans la page Filtrer les lignes de la boîte de dialogue Propriétés de la publication - <Publication> , sélectionnez un filtre de lignes existant ou un filtre de jointure dans le volet Tables filtrées.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. Cliquez sur Ajouter, puis sur Ajouter une jointure pour étendre le filtre sélectionné.Click Add, and then click Add Join to Extend the Selected Filter.

  3. Créez l'instruction de jointure : sélectionnez Utiliser le générateur pour créer l'instruction ou Créer manuellement l'instruction de jointure.Create the join statement: select either Use the builder to create the statement or Write the join the statement manually.

    • Si vous sélectionnez le générateur, utilisez les colonnes de la grille (Conjonction, Colonnes de table filtrée, Opérateuret Colonnes de table jointe) pour créer une instruction de jointure.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.

      Chaque colonne de la grille contient une zone de liste déroulante fixe permettant de sélectionner deux colonnes et un opérateur ( = , <> , <= , < , >= , > et like).Each column in the grid contains a drop-down combo box, allowing you to select two columns and an operator (=, <>, <=, <, >=, >, and like). Les résultats s'affichent dans la zone de texte Aperçu .The results are displayed in the Preview text area. Si la jointure concerne plus d'une paire de colonnes, sélectionnez une conjonction (AND ou OR) dans la colonne Conjonction , et entrez deux autres colonnes et un opérateur.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.

    • Si vous créez l'instruction manuellement, écrivez l'instruction de jointure dans la zone de texte Instruction de jointure .If you select to write the statement manually, write the join statement in the Join statement text area. Utilisez la zone de liste Colonnes de table filtrée et la zone de liste Colonnes de table jointe pour faire glisser et déposer des colonnes dans la zone de texte Instruction de jointure .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.

    • L'instruction de jointure complète est par exemple celle-ci :The complete join statement would appear like:

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

      La clause JOIN doit utiliser un nommage en deux parties ; les nommages en trois et en quatre parties ne sont pas pris en charge.The JOIN clause should use two-part naming; three-part naming and four-part naming are not supported.

  4. Spécifiez les options de jointure :Specify join options:

    • Si la colonne sur laquelle vous effectuez la jointure dans la table filtrée (la table parente) est unique, sélectionnez Clé unique.If the column on which you join in the filtered table (the parent table) is unique, select Unique key.

      Attention

      La sélection de cette option indique que la relation entre les tables enfant et parent dans un filtre de jointure correspond à une relation Un à un ou Un à plusieurs.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. Sélectionnez cette option seulement si vous avez une contrainte sur la colonne de jointure dans la table enfant qui garantit l'unicité.Only select this option if you have a constraint on the joining column in the child table that guarantees uniqueness. Si vous ne définissez pas correctement l'option, des erreurs de non-convergence de données peuvent se produire.If the option is set incorrectly, non-convergence of data can occur.

    • Par défaut, la réplication de fusion traite les modifications ligne par ligne lors de la synchronisation.By default, merge replication processes changes on a row-by-row basis during synchronization. Pour que les modifications dans les lignes de la table filtrée et de la table jointe soient traitées comme une unité, sélectionnez Enregistrement logique (MicrosoftMicrosoft SQL Server 2005 (9.x)SQL Server 2005 (9.x) et ses versions ultérieures seulement).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). Cette option est disponible uniquement si les conditions d'article et de publication d'utilisation d'enregistrements logiques sont satisfaites.This option is available only if the article and publication requirements for using logical records are met. Pour plus d’informations, consultez la section « Considérations relatives à l’utilisation d’enregistrements logiques » dans Regrouper les modifications apportées à des lignes connexes à l’aide d’enregistrements logiques.For more information see the section "Considerations for Using Logical Records" in Group Changes to Related Rows with Logical Records.

  5. Cliquez sur OK.Click OK.

  6. Si vous êtes dans la boîte de dialogue Propriétés de la publication - <Publication> , cliquez sur OK pour enregistrer et fermer la boîte de dialogue.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

Pour modifier un filtre de jointureTo modify a join filter

  1. Dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou dans la page Filtrer les lignes de la boîte de dialogue Propriétés de la publication - <Publication> , sélectionnez un filtre dans le volet Tables filtrées, puis cliquez sur Modifier.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. Dans la boîte de dialogue Modifier une jointure , modifiez le filtre.In the Edit Join dialog box, modify the filter.

  3. Cliquez sur OK.Click OK.

Pour supprimer un filtre de jointureTo delete a join filter

  1. Dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou la page Filtrer les lignes de la boîte de dialogue Propriétés de la publication - <Publication> , sélectionnez un filtre dans le volet Tables filtrées, puis cliquez sur Supprimer.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. Si le filtre de jointure que vous supprimez est lui-même étendu par d'autres jointures, ces jointures seront aussi supprimées.If the join filter you delete is itself extended by other joins, those joins will also be deleted.

Utilisation de Transact-SQLUsing Transact-SQL

Ces procédures montrent un filtre paramétrable sur un article parent avec des filtres de jointure entre cet article et des articles enfants connexes.These procedures show a parameterized filter on a parent article with join filters between this article and related child articles. Les filtres de jointure peuvent être définis et modifiés par programme à l'aide des procédures stockées de réplication.Join filters can be defined and modified programmatically using replication stored procedures.

Pour définir un filtre de jointure pour étendre un filtre d'article aux articles connexes dans une publication de fusionTo define a join filter to extend an article filter to related articles in a merge publication

  1. Définissez le filtrage pour l'article auquel s'effectue la jointure, qui est également connu comme l'article parent.Define the filtering for the article being joined to, which is also known as the parent article.

  2. Exécutez sp_addmergearticle (Transact-SQL) sur la base de données de publication du serveur de publication pour définir un ou plusieurs articles connexes, également appelés « articles enfants », pour la publication.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. Pour plus d'informations, voir Define an Article.For more information, see Define an Article.

  3. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergefilter (Transact-SQL).At the Publisher on the publication database, execute sp_addmergefilter (Transact-SQL). Spécifiez @publication, le nom unique de ce filtre pour @filtername, le nom de l’article enfant créé à l’étape 2 pour @article, le nom de l’article parent auquel s’effectue la jointure pour @join_articlename, et l’une des valeurs suivantes pour @join_unique_key :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 – indique une jointure plusieurs-à-un ou plusieurs-à-plusieurs entre les articles parents et enfants.0 - indicates a many-to-one or many-to-many join between the parent and child articles.

    • 1 – indique une jointure un-à-un ou un-à-plusieurs entre les articles parents et enfants.1 - indicates a one-to-one or one-to-many join between the parent and child articles.

    Cela définit un filtre de jointure entre les deux articles.This defines a join filter between the two articles.

    Attention

    Affectez uniquement à @join_unique_key la valeur 1 s’il existe une contrainte sur la colonne de jointure dans la table sous-jacente pour l’article parent qui garantit l’unicité.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. Si @join_unique_key se voit affecter la valeur 1 de manière inappropriée, une non-convergence des données peut se produire.If @join_unique_key is set to 1 incorrectly, non-convergence of data may occur.

Exemples (Transact-SQL)Examples (Transact-SQL)

Cet exemple définit un article pour une publication de fusion, où l'article de la table SalesOrderDetail est filtré par rapport à la table SalesOrderHeader qui est elle-même filtrée à l'aide d'un filtre de ligne statique.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. Pour plus d'informations, voir Définir et modifier un filtre de lignes statiques.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

Cet exemple définit un groupe d'articles dans une publication de fusion où les articles sont filtrés à l'aide d'une série de filtres de jointure par rapport à la table Employee , qui est elle-même filtrée à l'aide d'un filtre de lignes paramétrable sur la valeur de HOST_NAME dans la colonne LoginID .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. Pour plus d'informations, voir Définir et modifier un filtre de lignes paramétrable pour un article de fusion.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

Voir aussiSee Also

Filtres de jointure Join Filters
Filtres de lignes paramétrés Parameterized Row Filters
Changer les propriétés des publications et des articles Change Publication and Article Properties
Filtrer des données publiées en vue de la réplication de fusion Filter Published Data for Merge Replication
Procédure : définir et modifier un filtre de jointure entre des articles de fusion (SQL Server Management Studio) How to: Define and Modify a Join Filter Between Merge Articles (SQL Server Management Studio)
Concepts liés aux procédures stockées système de réplication Replication System Stored Procedures Concepts
Définir une relation d’enregistrement logique entre des articles de table de fusion Define a Logical Record Relationship Between Merge Table Articles
Définir et modifier un filtre de lignes paramétrable pour un article de fusionDefine and Modify a Parameterized Row Filter for a Merge Article