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

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 explique comment définir et modifier un filtre de lignes paramétrable 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 parameterized row filter in SQL ServerSQL Server by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

Lorsque vous créez des articles de table, vous pouvez utiliser des filtres de lignes paramétrables.When creating table articles, you can use parameterized row filters. Ces filtres utilisent une clause WHERE pour sélectionner les données appropriées à publier.These filters use a WHERE clause to select the appropriate data to be published. Au lieu de spécifier une valeur littérale dans la clause (comme c'est le cas avec un filtre de lignes statique), vous spécifiez l’une des deux fonctions système suivantes ou les deux : SUSER_SNAME et HOST_NAME.Rather than specifying a literal value in the clause (as you do with a static row filter), you specify one or both of the following system functions: SUSER_SNAME and HOST_NAME. Pour plus d'informations, voir Parameterized Row Filters.For more information, see Parameterized Row Filters.

Dans cette rubriqueIn This Topic

Avant de commencerBefore You Begin

Limitations et restrictionsLimitations and 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.If you add, modify, or delete a parameterized row 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

  • 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().For performance reasons, we recommend that you not apply functions to column names in parameterized row filter clauses, such as 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.If you use HOST_NAME in a filter clause and override the HOST_NAME value, it might be necessary to convert data types using 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.For more information about best practices for this case, see the section "Overriding the HOST_NAME() Value" in the topic Parameterized Row Filters.

Utilisation de SQL Server Management StudioUsing 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 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 parameterized row 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 lignes paramétrableTo define a parameterized row 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> , cliquez sur Ajouter, puis sur Ajouter un filtre.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, click Add, and then click Add Filter.

  2. Dans la boîte de dialogue Ajouter un filtre , sélectionnez une table à filtrer dans la zone de liste déroulante.In the Add Filter dialog box, select a table to filter from the drop-down list box.

  3. Créez une instruction de filtrage dans la zone de texte Instruction de filtrage .Create a filter statement in the Filter statement text box. 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 .You can type directly in the text area, and you can also drag and drop columns from the Columns list box.

    • La zone de texte Instruction de filtrage comprend un texte par défaut, qui est de la forme suivante :The Filter statement text area includes the default text, which is in the form of:

      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.The default text cannot be changed; type the filter clause after the WHERE keyword using standard SQL syntax. 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.A parameterized filter includes a call to the system function HOST_NAME() and/or SUSER_SNAME(), or a user-defined function that references one or both of these functions. Voici un exemple de clause de filtrage complète pour un filtre de lignes paramétrable :The following is an example of a complete filter clause for a parameterized row filter:

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

  4. Sélectionnez l'option qui correspond aux données qui seront partagées entre des Abonnés :Select the option that matches how data will be shared among Subscribers:

    • Une ligne de cette table ira à plusieurs abonnementsA row from this table will go to multiple subscriptions

    • Filtre paramétré créant des partitions qui ne se chevauchent pas, avec un seul abonnement par partitionA row from this table will go to only one subscription

    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.If you select A row from this table will go to only one subscription, merge replication can optimize performance by storing and processing less metadata. 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é.However, you must ensure that the data is partitioned in such a way that a row cannot be replicated to more than one Subscriber. Pour plus d'informations, consultez la section « Définition de « partition options » » dans la rubrique Parameterized Row Filters.For more information, see the section "Setting 'partition options'" in the topic Parameterized Row Filters.

  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 lignes paramétrableTo modify a parameterized row 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 le filtre , modifiez le filtre.In the Edit Filter dialog box, modify the filter.

  3. Cliquez sur OK.Click OK.

Pour supprimer un filtre de lignes paramétrableTo delete a parameterized row 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 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.

Utilisation de Transact-SQLUsing 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.Parameterized row filters can be created and modified programmatically using replication stored procedures.

Pour définir un filtre de lignes paramétrable pour un article dans une publication de fusionTo define a parameterized row filter for an article in a merge publication

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergearticle (Transact-SQL).At the Publisher on the publication database, execute 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 :Specify @publication, a name for the article for @article, the table being published for @source_object, the WHERE clause that defines the parameterized filter for @subset_filterclause (not including WHERE), and one of the following values for @partition_options, which describes the type of partitioning that will result from the parameterized row filter:

    • 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).0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" partition).

    • 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.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 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.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 - le filtrage de l'article génère des partitions qui ne se chevauchent pas et qui sont uniques pour chaque abonnement.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

Pour modifier un filtre de lignes paramétrable pour un article dans une publication de fusionTo change a parameterized row filter for an article in a merge publication

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Spécifiez @publication, @article, affectez la valeur subset_filterclause à @property, l’expression qui définit le filtre paramétrable à @value (sans WHERE) et la valeur 1 à @force_invalidate_snapshot et @force_reinit_subscription.Specify @publication, @article, a value of subset_filterclause for @property, the expression that defines the parameterized filter for @value (not including WHERE), and a value of 1 for both @force_invalidate_snapshot and @force_reinit_subscription.

  2. Si cette modification conduit à un comportement de partitionnement différent, exécutez de nouveau sp_changemergearticle .If this change results in different partitioning behavior, then execute sp_changemergearticle again. Spécifiez @publication, @article, affectez la valeur partition_options à @property et l’option de partitionnement la plus appropriée à @value, qui peut être l’une des suivantes :Specify @publication, @article, a value of partition_options for @property, and the most appropriate partitioning option for @value, which can be one of the following:

    • 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).0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" partition).

    • 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.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 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.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 - le filtrage de l'article génère des partitions qui ne se chevauchent pas et qui sont uniques pour chaque abonnement.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

Exemple (Transact-SQL)Example (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 .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 LoginID column. Pendant la synchronisation, la valeur retournée par la fonction HOST_NAME est remplacée.During synchronization, the value returned by the HOST_NAME function is overridden. Pour plus d'informations, consultez la section « Substitution de la valeur de HOST_NAME() » dans la rubrique Parameterized Row Filters.For more information, see Overriding the HOST_NAME() Value in the topic 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'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

Définir et modifier un filtre de jointure entre des articles de fusion Define and Modify a Join Filter Between Merge Articles
Changer les propriétés des publications et des articles Change Publication and Article Properties
Filtres de jointure Join Filters
Filtres de lignes paramétrésParameterized Row Filters