Procédure : définir et modifier un filtre de lignes statique (programmation Transact-SQL de la réplication)

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. Comme ces filtres sont statiques, tous les abonnés recevront le même sous-ensemble des données. Si vous devez filtrer dynamiquement des lignes dans un article de table qui appartient à une publication de fusion afin que chaque abonné reçoive une partition différente des données, consultez Procédure : définir et modifier un filtre de lignes paramétrable pour un article de fusion (programmation Transact-SQL de la réplication). La réplication de fusion vous permet également de filtrer des lignes connexes en fonction d'un filtre de lignes existant. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication).

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

  1. Définissez l'article à filtrer. Pour plus d'informations, consultez Procédure : définir un article (programmation Transact-SQL de la réplication).

  2. Exécutez sp_articlefilter (Transact-SQL) sur la base de données de publication du serveur de publication. Spécifiez le nom de l'article pour @article, le nom de la publication pour @publication, un nom pour le filtre pour @filter_name et la clause de filtre pour @filter_clause (WHERE non compris).

  3. Si un filtre de colonne doit encore être défini, consultez Procédure : définir et modifier un filtre de colonne (programmation Transact-SQL de la réplication). Dans le cas contraire, exécutez 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. Cela crée les objets de synchronisation pour l'article filtré.

Pour modifier un filtre de lignes statique pour une publication transactionnelle ou de capture instantanée

  1. Exécutez sp_articlefilter (Transact-SQL) sur la base de données de publication du serveur de publication. 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). Comme cette modification invalidera des données dans les abonnements existants, spécifiez la valeur 1 pour @force_reinit_subscription.

  2. Exécutez sp_articleview (Transact-SQL) sur la base de données de publication du serveur de publication. 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. Cela recrée la vue qui définit l'article filtré.

  3. Exécutez de nouveau le travail de l'Agent de capture instantanée pour la publication afin de générer une capture instantanée mise à jour. Pour plus d'informations, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

  4. Réinitialisez les abonnements. Pour plus d'informations, consultez Procédure : réinitialiser un abonnement (programmation Transact-SQL de la réplication).

Pour supprimer un filtre de lignes statique pour une publication transactionnelle ou de capture instantanée

  1. Exécutez sp_articlefilter (Transact-SQL) sur la base de données de publication du serveur de publication. 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. 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 de capture instantanée pour la publication afin de générer une capture instantanée mise à jour. Pour plus d'informations, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

  3. Réinitialisez les abonnements. Pour plus d'informations, consultez Procédure : réinitialiser un abonnement (programmation Transact-SQL de la réplication).

Pour définir un filtre de lignes statique pour une publication de fusion

  1. Exécutez sp_addmergearticle (Transact-SQL) sur la base de données de publication du serveur de publication. Spécifiez la clause de filtre pour @subset_filterclause (WHERE non compris). Pour plus d'informations, consultez Procédure : définir un article (programmation Transact-SQL de la réplication).

  2. Si un filtre de colonne doit encore être défini, consultez Procédure : définir et modifier un filtre de colonne (programmation Transact-SQL de la réplication).

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

  1. Exécutez sp_changemergearticle (Transact-SQL) sur la base de données de publication du serveur de publication. 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). 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 de capture instantanée pour la publication afin de générer une capture instantanée mise à jour. Pour plus d'informations, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

  3. Réinitialisez les abonnements. Pour plus d'informations, consultez Procédure : réinitialiser un abonnement (programmation Transact-SQL de la réplication).

Exemple

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, consultez Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication).

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