Définir et modifier un filtre de lignes paramétrable pour un article de fusion

S’applique à :SQL Server

Cette rubrique explique comment définir et modifier un filtre de lignes paramétrable dans SQL Server à l’aide de SQL Server Management Studio ou de Transact-SQL.

Lorsque vous créez des articles de table, vous pouvez utiliser des filtres de lignes paramétrables. Ces filtres utilisent une clause WHERE pour sélectionner les données appropriées à publier. Plutôt que de spécifier une valeur littérale dans la clause (comme dans un filtre de lignes statique), vous spécifiez l'une des deux fonctions système suivantes ou les deux : SUSER_SNAME et HOST_NAME. Pour plus d'informations, voir Parameterized Row Filters.

Dans cette rubrique

Avant de commencer

Limitations et restrictions

  • Si vous ajoutez, modifiez ou supprimez un filtre de ligne paramétré 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 une fois la modification effectuée. 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

  • Pour des raisons de performance, il est recommandé de ne pas appliquer de fonctions aux noms de colonne dans les clauses des filtres de lignes paramétrables, telles que LEFT([MyColumn]) = SUSER_SNAME(). Si vous utilisez HOST_NAME dans une clause de filtrage puis en remplacez la valeur, il peut s'avérer judicieux de convertir les types de données avec la fonction CONVERT. Pour plus d'informations sur la conduite à adopter dans cette situation, consultez la section « Substitution de la valeur de HOST_NAME » de la rubrique Parameterized Row Filters.

Utilisation de SQL Server Management Studio

Définissez, modifiez et supprimez des filtres de lignes paramétrables dans la page Filtrer les lignes de la table de filtre 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 lignes paramétrable

  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>, cliquez sur Ajouter, puis sur Ajouter un filtre.

  2. Dans la boîte de dialogue Ajouter un filtre , sélectionnez une table à filtrer dans la zone de liste déroulante.

  3. Créez une instruction de filtrage dans la zone de texte Instruction de filtrage . Vous pouvez taper directement dans la zone de texte, mais vous pouvez aussi faire glisser et déposer des colonnes depuis la zone de liste Colonnes .

    • La zone de texte Instruction de filtrage comprend un texte par défaut, qui est de la forme suivante :

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • Le texte par défaut ne peut pas être modifié ; tapez la clause du filtre après le mot clé WHERE en utilisant la syntaxe SQL standard. Un filtrage paramétrable comprend un appel à la fonction système HOST_NAME() et/ou SUSER_SNAME(), ou bien une fonction définie par l'utilisateur qui référence une de ces fonctions ou les deux. Voici un exemple de clause de filtrage complète pour un filtre de lignes paramétrable :

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

      La clause WHERE doit utiliser un nommage en deux parties ; les nommages en trois et en quatre parties ne sont pas pris en charge.

  4. Sélectionnez l'option qui correspond aux données qui seront partagées entre des Abonnés :

    • Une ligne de cette table ira à plusieurs abonnements

    • Filtre paramétré créant des partitions qui ne se chevauchent pas, avec un seul abonnement par partition

    Si vous sélectionnez Filtre paramétré créant des partitions qui ne se chevauchent pas, avec un seul abonnement par partition, la réplication de fusion peut optimiser les performances en stockant et en traitant moins de métadonnées. Cependant, vous devez vérifier que les données sont partitionnées de telle façon qu'une ligne ne peut pas être répliquée sur plus d'un Abonné. Pour plus d'informations, consultez la section « Définition de « partition options » » dans la rubrique Parameterized Row Filters.

  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 lignes paramétrable

  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 le filtre , modifiez le filtre.

  3. Cliquez sur OK.

Pour supprimer un filtre de lignes paramétrable

  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.

Utilisation de Transact-SQL

Les filtres de lignes paramétrables peuvent être créés et modifiés par programme en utilisant des procédures stockées de réplication.

Pour définir un filtre de lignes paramétrable pour un article dans une publication de fusion

  1. Sur le serveur de publication sur la base de données de publication, exécutez sp_addmergearticle (Transact-SQL). Spécifiez @publication, le nom de l'article pour @article, la table qui est publiée pour @source_object, la clause WHERE qui définit le filtre paramétrable pour @subset_filterclause (sans WHERE) et affectez l'une des valeurs suivantes à @partition_options, qui décrit le type de partitionnement qui résultera de l'application du filtre de lignes paramétrable :

    • 0 - le filtrage de l'article est statique ou ne génère pas un sous-ensemble unique de données pour chaque partition (partition avec chevauchement).

    • 1 - les partitions obtenues se chevauchent et les mises à jour apportées au niveau de l'Abonné ne peuvent pas modifier la partition à laquelle une ligne appartient.

    • 2 - le filtrage de l'article génère des partitions qui ne se chevauchent pas, mais plusieurs Abonnés peuvent recevoir la même partition.

    • 3 - le filtrage de l'article génère des partitions qui ne se chevauchent pas et qui sont uniques pour chaque abonnement.

Pour modifier un filtre de lignes paramétrable pour un article dans une publication de fusion

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle. Spécifiez @publication, @article, affectez la valeur subset_filterclause à @property, the expression that defines the parameterized filter à @value (sans WHERE) et la valeur 1 à both @àce_invalidate_snapshot et @àce_reinit_subscription.

  2. Si cette modification conduit à un comportement de partitionnement différent, exécutez de nouveau sp_changemergearticle . Spécifiez @publication, @article, affectez la valeur partition_options à @propertyet l'option de partitionnement la plus appropriée à @value, qui peut être l'une des suivantes :

    • 0 - le filtrage de l'article est statique ou ne génère pas un sous-ensemble unique de données pour chaque partition (partition avec chevauchement).

    • 1 - les partitions obtenues se chevauchent et les mises à jour apportées au niveau de l'Abonné ne peuvent pas modifier la partition à laquelle une ligne appartient.

    • 2 - le filtrage de l'article génère des partitions qui ne se chevauchent pas, mais plusieurs Abonnés peuvent recevoir la même partition.

    • 3 - le filtrage de l'article génère des partitions qui ne se chevauchent pas et qui sont uniques pour chaque abonnement.

Exemple (Transact-SQL)

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 sur la table Employee , qui est elle-même filtrée à l'aide d'un filtre de lignes paramétrable sur la colonne LoginID . Pendant la synchronisation, la valeur retournée par la fonction HOST_NAME est remplacée. Pour plus d'informations, consultez la section « Substitution de la valeur de HOST_NAME() » dans la rubrique Parameterized Row Filters.

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

Définir et modifier un filtre de jointure entre des articles de fusion
Changer les propriétés des publications et des articles
Filtres de jointure
Filtres de lignes paramétrés