Définir et modifier un filtre de lignes statiqueDefine and Modify a Static Row Filter

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database (Managed Instance uniquement) nonAzure Synapse Analytics (SQL DW) nonParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database (Managed Instance only) noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

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

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 statique 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 static 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.

  • Si la publication est activée pour la réplication transactionnelle d'égal à égal, les tables ne peuvent pas être filtrées.If the publication is enabled for peer-to-peer transactional replication, tables cannot be filtered.

RecommandationsRecommendations

Utilisation de SQL Server Management StudioUsing SQL Server Management Studio

Définissez, modifiez et supprimez des filtres de lignes statiques 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 static 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 statiquesTo define a static 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> , l’action effectuée dépend du type de publication :On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box, the action you take depends on the type of publication:

    • Pour une publication transactionnelle ou d'instantané, cliquez sur Ajouter.For a snapshot or transactional publication, click Add.

    • Pour une publication de fusion, cliquez sur Ajouterpuis sur Ajouter un filtre.For a merge 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 area. 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.

    Notes

    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. Si la publication provient d'un serveur de publication Oracle, la clause WHERE doit respecter la syntaxe Oracle.If the publication is from an Oracle Publisher, the WHERE clause must be compliant with Oracle syntax.

    • 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 [schema].[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. La clause de filtrage complète ressemble à ceci :The complete filter clause would appear like:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE [LoginID] = 'adventure-works\ranjit0'  
      
    • Un filtre de lignes statiques peut inclure une fonction définie par l'utilisateur.A static row filter can include a user-defined function. La clause de filtrage complète pour un filtre de lignes statiques avec une fonction définie par l'utilisateur ressemble à ceci :The complete filter clause for a static row filter with a user-defined function would appear like:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] WHERE MyFunction([Freight]) > 100  
      
  4. Cliquez sur OK.Click OK.

  5. 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 statiquesTo modify a static 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> dialog box, 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 statiquesTo delete a static 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> dialog box, select a filter in the Filtered Tables pane, and then click Delete.

Utilisation de Transact-SQLUsing Transact-SQL

Lorsque vous créez des articles de table, vous pouvez définir une clause WHERE pour éliminer par filtrage des lignes d'un article.When creating table articles, you can define a WHERE clause to filter rows out of an article. Vous pouvez également modifier un filtre de lignes après qu'il a été défini.You can also change a row filter after it has been defined. Les filtres de lignes statiques peuvent être créés et modifiés par programme à l'aide des procédures stockées de réplication.Static row filters can be created and modified programmatically using replication stored procedures.

Pour définir un filtre de lignes statique pour une publication transactionnelle ou d'instantanéTo define a static row filter for a snapshot or transactional publication

  1. Définissez l'article à filtrer.Define the article to filter. Pour plus d'informations, voir définir un Article.For more information, see Define an Article.

  2. Dans la base de données de publication sur le serveur de publication, exécutez sp_articlefilter (Transact-SQL).At the Publisher on the publication database, execute sp_articlefilter (Transact-SQL). Spécifiez le nom de l’article pour @article, le nom de la publication pour @publication, un nom de filtre pour @filter_name et la clause de filtre pour @filter_clause (WHERE non compris).Specify the name of the article for @article, the name of the publication for @publication, a name for the filter for @filter_name, and the filtering clause for @filter_clause (not including WHERE).

  3. Si un filtre de colonne doit encore être défini, consultez Définir et modifier un filtre de colonne.If a column filter must still be defined, see Define and Modify a Column Filter. Sinon, exécutez sp_articleview (Transact-SQL).Otherwise, execute sp_articleview (Transact-SQL). Spécifiez le nom de la publication pour @publication, le nom de l’article filtré pour @article et la clause de filtre spécifiée à l’étape 2 pour @filter_clause.Specify the publication name for @publication, the name of the filtered article for @article, and the filter clause specified in step 2 for @filter_clause. Les objets de synchronisation pour l'article filtré sont alors créés.This creates the synchronization objects for the filtered article.

Pour modifier un filtre de lignes statique pour une publication transactionnelle ou d'instantanéTo modify a static row filter for a snapshot or transactional publication

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_articlefilter (Transact-SQL).At the Publisher on the publication database, execute sp_articlefilter (Transact-SQL). Spécifiez le nom de l’article pour @article, le nom de la publication pour @publication, un nom pour le nouveau filtre pour @filter_name et la nouvelle clause de filtre pour @filter_clause (WHERE non compris).Specify the name of the article for @article, the name of the publication for @publication, a name for the new filter for @filter_name, and the new filtering clause for @filter_clause (not including WHERE). Comme cette modification invalide des données dans les abonnements existants, spécifiez la valeur 1 pour @force_reinit_subscription.Because this change will invalidate data in existing subscriptions, specify a value of 1 for @force_reinit_subscription.

  2. Dans la base de données de publication sur le serveur de publication, exécutez sp_articleview (Transact-SQL).At the Publisher on the publication database, execute sp_articleview (Transact-SQL). Spécifiez le nom de la publication pour @publication, le nom de l’article filtré pour @article et la clause de filtre spécifiée à l’étape 1 pour @filter_clause.Specify the publication name for @publication, the name of the filtered article for @article, and the filter clause specified in step 1 for @filter_clause. Cela recrée la vue qui définit l'article filtré.This re-creates the view that defines the filtered article.

  3. Exécutez de nouveau le travail de l'Agent d'instantané pour la publication afin de générer un instantané mis à jour.Rerun the Snapshot Agent job for the publication to generate an updated snapshot. Pour plus d’informations, consultez Create and Apply the Initial Snapshot.For more information, see Create and Apply the Initial Snapshot.

  4. Réinitialiser les abonnements.Reinitialize subscriptions. Pour plus d’informations, consultez Réinitialiser des abonnements.For more information, see Reinitialize Subscriptions.

Pour supprimer un filtre de lignes statique pour une publication transactionnelle ou d'instantanéTo delete a static row filter for a snapshot or transactional publication

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_articlefilter (Transact-SQL).At the Publisher on the publication database, execute sp_articlefilter (Transact-SQL). Spécifiez le nom de l’article pour @article, le nom de la publication pour @publication, la valeur NULL pour @filter_name et la valeur NULL pour @filter_clause.Specify the name of the article for @article, the name of the publication for @publication, a value of NULL for @filter_name, and a value of NULL for @filter_clause. Comme cette modification invalide des données dans les abonnements existants, spécifiez la valeur 1 pour @force_reinit_subscription.Because this change will invalidate data in existing subscriptions, specify a value of 1 for @force_reinit_subscription.

  2. Exécutez de nouveau le travail de l'Agent d'instantané pour la publication afin de générer un instantané mis à jour.Rerun the Snapshot Agent job for the publication to generate an updated snapshot. Pour plus d’informations, consultez Create and Apply the Initial Snapshot.For more information, see Create and Apply the Initial Snapshot.

  3. Réinitialiser les abonnements.Reinitialize subscriptions. Pour plus d’informations, consultez Réinitialiser des abonnements.For more information, see Reinitialize Subscriptions.

Pour définir un filtre de lignes statique pour une publication de fusionTo define a static row filter for 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 la clause de filtre pour @subset_filterclause (WHERE non compris).Specify the filtering clause for @subset_filterclause (not including WHERE). Pour plus d’informations, consultez définir un Article.For more information, see Define an Article.

  2. Si un filtre de colonne doit encore être défini, consultez Définir et modifier un filtre de colonne.If a column filter must still be defined, see Define and Modify a Column Filter.

Pour modifier un filtre de lignes statique pour une publication de fusionTo modify a static row filter for a merge publication

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle (Transact-SQL).At the Publisher on the publication database, execute sp_changemergearticle (Transact-SQL). Spécifiez le nom de la publication pour @publication, le nom de l’article filtré pour @article, une valeur de subset_filterclause pour @property et la nouvelle clause de filtre pour @value (WHERE non compris).Specify the publication name for @publication, the name of the filtered article for @article, a value of subset_filterclause for @property, and the new filtering clause for @value (not including WHERE). Comme cette modification invalidera des données dans les abonnements existants, spécifiez la valeur 1 pour @force_reinit_subscription.Because this change will invalidate data in existing subscriptions, specify a value of 1 for @force_reinit_subscription.

  2. Exécutez de nouveau le travail de l'Agent d'instantané pour la publication afin de générer un instantané mis à jour.Rerun the Snapshot Agent job for the publication to generate an updated snapshot. Pour plus d’informations, consultez Create and Apply the Initial Snapshot.For more information, see Create and Apply the Initial Snapshot.

  3. Réinitialiser les abonnements.Reinitialize subscriptions. Pour plus d’informations, consultez Réinitialiser des abonnements.For more information, see Reinitialize Subscriptions.

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

Dans cet exemple de réplication transactionnelle, l'article est filtré horizontalement pour que tous les produits ayant cessé d'être suivis soient supprimés.In this transactional replication example, the article is filtered horizontally to remove all discontinued products.

DECLARE @publication    AS sysname;
DECLARE @table AS sysname;
DECLARE @filterclause AS nvarchar(500);
DECLARE @filtername AS nvarchar(386);
DECLARE @schemaowner AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @table = N'Product';
SET @filterclause = N'[DiscontinuedDate] IS NULL'; 
SET @filtername = N'filter_out_discontinued';
SET @schemaowner = N'Production';

-- Add a horizontally and vertically filtered article for the Product table.
-- Manually set @schema_option to ensure that the Production schema 
-- is generated at the Subscriber (0x8000000).
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @table, 
    @source_object = @table,
    @source_owner = @schemaowner, 
    @schema_option = 0x80030F3,
    @vertical_partition = N'true', 
    @type = N'logbased',
    @filter_clause = @filterclause;

-- (Optional) Manually call the stored procedure to create the 
-- horizontal filtering stored procedure. Since the type is 
-- 'logbased', this stored procedures is executed automatically.
EXEC sp_articlefilter 
    @publication = @publication, 
    @article = @table, 
    @filter_clause = @filterclause, 
    @filter_name = @filtername;

-- Add all columns to the article.
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table;

-- Remove the DaysToManufacture column from the article
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table, 
    @column = N'DaysToManufacture', 
    @operation = N'drop';

-- (Optional) Manually call the stored procedure to create the 
-- vertical filtering view. Since the type is 'logbased', 
-- this stored procedures is executed automatically.
EXEC sp_articleview 
    @publication = @publication, 
    @article = @table,
    @filter_clause = @filterclause;
GO

Dans cet exemple de réplication de fusion, les articles sont filtrés horizontalement pour que seules les lignes qui appartiennent au vendeur spécifié soient retournées.In this merge replication example, the articles are filtered horizontally to return only rows that belong to the specified salesperson. Un filtre de jointure est également utilisé.A join filter is also used. Pour plus d’informations, consultez Définir et modifier un filtre de jointure entre des articles de fusion.For more information, see Define and Modify a Join Filter Between Merge Articles.

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

Voir aussiSee Also

DDéfinir et modifier un filtre de lignes paramétrable pour un article de fusion Define and Modify a Parameterized Row Filter for a Merge Article
Changer les propriétés des publications et des articles Change Publication and Article Properties
Filtrer des données publiées Filter Published Data
Filtrer des données publiées en vue de la réplication de fusionFilter Published Data for Merge Replication