Définir et modifier un filtre de jointure entre des articles de fusion

S’applique à :SQL Server

Cette rubrique explique comment définir et modifier un filtre de jointure entre des articles de fusion dans SQL Server à l’aide de SQL Server Management Studio ou de Transact-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.

Dans cette rubrique

Avant de commencer

Limitations et restrictions

  • Pour qu'il soit possible de créer un filtre de jointure, la publication doit contenir au minimum deux tables associées. 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. 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.

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

Recommandations

Utilisation de SQL Server Management Studio

Définissez, modifiez et supprimez des filtres de jointure dans la page Filtrer les lignes de 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>. 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.

Pour définir un filtre de jointure

  1. Dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou la page Filtrer les lignes de la composition Propriétés - <Publication>, sélectionnez un filtre de lignes ou un filtre de jointure existant dans le volet Tables filtrées.

  2. Cliquez sur Ajouter, puis sur Ajouter une jointure pour étendre le filtre sélectionné.

  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.

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

      Chaque colonne de la grille contient une zone de liste déroulante, ce qui vous permet de sélectionner deux colonnes et un opérateur (=, <>=<, <>=, =, >et like). Les résultats s'affichent dans la zone de texte Aperçu . 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.

    • Si vous créez l'instruction manuellement, écrivez l'instruction de jointure dans la zone de texte Instruction de jointure . 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 .

    • L'instruction de jointure complète est par exemple celle-ci :

      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.

  4. Spécifiez les options de jointure :

    • Si la colonne sur laquelle vous effectuez la jointure dans la table filtrée (la table parente) est unique, sélectionnez Clé unique.

      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. Sélectionnez cette option seulement si vous avez une contrainte sur la colonne de jointure dans la table enfant qui garantit l'unicité. Si vous ne définissez pas correctement l'option, des erreurs de non-convergence de données peuvent se produire.

    • Par défaut, la réplication de fusion traite les modifications ligne par ligne lors de la synchronisation. Pour avoir des modifications connexes dans les lignes de la table filtrée et de la table jointe traitée en tant qu’unité, sélectionnez Enregistrement logique (Microsoft SQL Server 2005 (9.x) et versions ultérieures uniquement). Cette option est disponible uniquement si les conditions d'article et de publication d'utilisation d'enregistrements logiques sont satisfaites. 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.

  5. Cliquez sur OK.

  6. Si vous êtes dans la boîte de dialogue Propriétés de publication - <Publication> , cliquez sur OK pour enregistrer et fermer la boîte de dialogue.

Pour modifier un filtre de jointure

  1. Dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou la page Filtrer les lignes de la composition Propriétés de publication - <Publication>, sélectionnez un filtre dans le volet Tables filtrées, puis cliquez sur Modifier.

  2. Dans la boîte de dialogue Modifier une jointure , modifiez le filtre.

  3. Cliquez sur OK.

Pour supprimer un filtre de jointure

  1. Dans la page Filtrer les lignes de la table de l’Assistant Nouvelle publication ou la page Filtrer les lignes des propriétés de publication - <Publication>, sélectionnez un filtre dans le volet Tables filtrées, puis cliquez sur Supprimer. Si le filtre de jointure que vous supprimez est lui-même étendu par d'autres jointures, ces jointures seront aussi supprimées.

Utilisation de 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. Les filtres de jointure peuvent être définis et modifiés par programme à l'aide des procédures stockées de réplication.

Pour définir un filtre de jointure pour étendre un filtre d'article aux articles connexes dans une publication de fusion

  1. Définissez le filtrage pour l'article auquel s'effectue la jointure, qui est également connu comme l'article parent.

  2. Sur le serveur de publication sur la base de données de publication, exécutez sp_addmergearticle (Transact-SQL) pour définir un ou plusieurs articles connexes, également appelés articles enfants, pour la publication. Pour plus d’informations, consultez définir un Article.

  3. Sur le serveur de publication sur la base de données de publication, exécutez 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 :

    • 0 – indique une jointure plusieurs-à-un ou plusieurs-à-plusieurs entre les articles parents et enfants.

    • 1 – indique une jointure un-à-un ou un-à-plusieurs entre les articles parents et enfants.

    Cela définit un filtre de jointure entre les deux 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é. Si @join_unique_key se voit affecter la valeur 1 de manière inappropriée, une non-convergence des données peut se produire.

Exemples (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. Pour plus d'informations, voir Définir et modifier un filtre de lignes statiques.

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 . Pour plus d'informations, voir Définir et modifier un filtre de lignes paramétrable pour un article de fusion.

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

Voir aussi

Filtres de jointure
Filtres de lignes paramétrés
Changer les propriétés des publications et des articles
Filtrer des données publiées en vue de la réplication de fusion
Procédure : définir et modifier un filtre de jointure entre des articles de fusion (SQL Server Management Studio)
Concepts liés aux procédures stockées système de réplication
Définir une relation d’enregistrement logique entre des articles de table de fusion
Définir et modifier un filtre de lignes paramétrable pour un article de fusion