Définir et modifier un filtre de lignes statiques

S’applique à :SQL ServerAzure SQL Managed Instance

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

Dans cette rubrique

Avant de commencer

Limitations et 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. 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.

  • Si la publication est activée pour la réplication transactionnelle d'égal à égal, les tables ne peuvent pas être filtrées.

Recommandations

Utilisation de SQL Server Management Studio

Définissez, modifiez et supprimez des filtres de lignes statiques 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 lignes statiques

  1. 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> , l’action que vous effectuez dépend du type de publication :

    • Pour une publication transactionnelle ou d'instantané, cliquez sur Ajouter.

    • Pour une publication de fusion, cliquez sur Ajouterpuis 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 .

    Remarque

    La clause WHERE doit utiliser un nommage en deux parties ; les nommages en trois et en quatre parties ne sont pas pris en charge. Si la publication provient d'un serveur de publication Oracle, la clause WHERE doit respecter la syntaxe Oracle.

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

      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. La clause de filtrage complète ressemble à ceci :

      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. La clause de filtrage complète pour un filtre de lignes statiques avec une fonction définie par l'utilisateur ressemble à ceci :

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

  5. 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 statiques

  1. 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> , 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 statiques

  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.

Utilisation de 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. Vous pouvez également modifier un filtre de lignes après qu'il a été défini. Les filtres de lignes statiques peuvent être créés et modifiés par programme à l'aide des procédures stockées de réplication.

Pour définir un filtre de lignes statique pour une publication transactionnelle ou d'instantané

  1. Définissez l'article à filtrer. Pour plus d’informations, consultez définir un Article.

  2. Sur le serveur de publication sur la base de données de publication, exécutez sp_articlefilter (Transact-SQL). Spécifiez le nom de l'article pour @article, le nom de la publication pour @publication, un nom pour le filtre pour @filter_nameet la clause de filtre pour @filter_clause ( WHEREnon compris).

  3. Si un filtre de colonne doit encore être défini, consultez Définir et modifier un filtre de colonne. Sinon, exécutez sp_articleview (Transact-SQL). Spécifiez le nom de la publication pour @publication, le nom de l’article filtré pour @articleet la clause de filtre spécifiée à l’étape 2 pour @filter_clause. Les objets de synchronisation pour l'article filtré sont alors créés.

Pour modifier un filtre de lignes statique pour une publication transactionnelle ou d'instantané

  1. Sur le serveur de publication sur la base de données de publication, exécutez 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_nameet la nouvelle clause de filtre pour @filter_clause ( WHEREnon compris). Comme cette modification invalidera des données dans les abonnements existants, spécifiez la valeur 1 pour @force_reinit_subscription.

  2. Sur le serveur de publication sur la base de données de publication, exécutez sp_articleview (Transact-SQL). Spécifiez le nom de la publication pour @publication, le nom de l'article filtré pour @articleet la clause de filtre spécifiée à l'étape 1 pour @filter_clause. Cela recrée la vue qui définit l'article filtré.

  3. Exécutez de nouveau le travail de l'Agent d'instantané pour la publication afin de générer un instantané mis à jour. Pour plus d’informations, voir Create and Apply the Initial Snapshot.

  4. Réinitialiser les abonnements. Pour plus d’informations, consultez Réinitialiser des abonnements.

Pour supprimer un filtre de lignes statique pour une publication transactionnelle ou d'instantané

  1. Sur le serveur de publication sur la base de données de publication, exécutez 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_nameet la valeur NULL pour @filter_clause. Comme cette modification invalidera des données dans les abonnements existants, spécifiez la valeur 1 pour @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. Pour plus d’informations, voir Create and Apply the Initial Snapshot.

  3. Réinitialiser les abonnements. Pour plus d’informations, consultez Réinitialiser des abonnements.

Pour définir un filtre de lignes statique pour 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 la clause de filtre pour @subset_filterclause ( WHEREnon compris). Pour plus d’informations, consultez définir un Article.

  2. Si un filtre de colonne doit encore être défini, consultez Définir et modifier un filtre de colonne.

Pour modifier un filtre de lignes statique pour une publication de fusion

  1. Sur le serveur de publication sur la base de données de publication, exécutez 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 @propertyet la nouvelle clause de filtre pour @value ( WHEREnon compris). Comme cette modification invalidera des données dans les abonnements existants, spécifiez la valeur 1 pour @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. Pour plus d’informations, voir Create and Apply the Initial Snapshot.

  3. Réinitialiser les abonnements. Pour plus d’informations, consultez Réinitialiser des abonnements.

Exemples (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.

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. Un filtre de jointure est également utilisé. Pour plus d'informations, voir Définir et modifier un filtre de jointure entre des articles de fusion.

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 aussi

Définir et modifier un filtre de lignes paramétrable pour un article de fusion
Changer les propriétés des publications et des articles
Filtrer des données publiées
Filtrer des données publiées en vue de la réplication de fusion