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

Lors de la création d'articles de table, vous pouvez définir les colonnes à inclure dans l'article et modifier ces colonnes une fois l'article défini. Vous pouvez créer et modifier par programme des colonnes filtrées en utilisant des procédures stockées de réplication. Certains types de colonnes, comme les colonnes identity et rowguid, ne peuvent pas être supprimés d'un article publié. Pour plus d'informations, consultez la section « Filtres de colonnes » dans la rubrique Filtrage des données publiées.

Notes

Les procédures suivantes supposent que la table sous-jacente n'a pas été modifiée. Pour plus d'informations sur la réplication des modifications du langage de définition de données (DDL) sur les tables publiées, consultez Modification du schéma dans les bases de données de publication.

Pour définir un filtre de colonne pour un article publié dans une publication transactionnelle ou d'instantané

  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. Dans la base de données de publication sur le serveur de publication, exécutez sp_articlecolumn. Les colonnes à inclure ou à supprimer de l'article sont alors définies.

    • En cas de publication de quelques colonnes d'une table en contenant de nombreuses, exécutez sp_articlecolumn une fois pour chaque colonne ajoutée. Spécifiez le nom de la colonne pour @column et affectez la valeur add à @operation.

    • En cas de publication de la plupart des colonnes d'une table en contenant de nombreuses, exécutez sp_articlecolumn, en affectant la valeur null à @column et la valeur add à @operation pour ajouter toutes les colonnes. Exécutez ensuite sp_articlecolumn, une fois pour chaque colonne qui est exclue, en affectant la valeur drop à @operation et le nom de la colonne exclue à @column.

  3. Dans la base de données de publication sur le serveur de publication, exécutez sp_articleview. Spécifiez le nom de la publication pour @publication et le nom de l'article filtré pour @article. Les objets de synchronisation pour l'article filtré sont alors créés.

Pour modifier un filtre de colonne de manière à inclure des colonnes supplémentaires pour un article publié dans une publication transactionnelle ou d'instantané

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_articlecolumn une fois pour chaque colonne ajoutée. Spécifiez le nom de la colonne pour @column et affectez la valeur add à @operation.

  2. Dans la base de données de publication sur le serveur de publication, exécutez sp_articleview. Spécifiez le nom de la publication pour @publication et le nom de l'article filtré pour @article. Si la publication contient des abonnements existants, affectez la valeur 1 à @change_active. Les objets de synchronisation pour l'article filtré sont alors recréés.

  3. Exécutez de nouveau le travail de l'Agent d'instantané pour la publication afin de générer un instantané mis à jour.

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

Pour modifier un filtre de colonne de manière à supprimer des colonnes pour un article publié dans une publication transactionnelle ou d'instantané

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_articlecolumn une fois pour chaque colonne supprimée. Spécifiez le nom de la colonne pour @column et affectez la valeur drop à @operation.

  2. Dans la base de données de publication sur le serveur de publication, exécutez sp_articleview. Spécifiez le nom de la publication pour @publication et le nom de l'article filtré pour @article. Si la publication contient des abonnements existants, affectez la valeur 1 à @change_active. Les objets de synchronisation pour l'article filtré sont alors recréés.

  3. Exécutez de nouveau le travail de l'Agent d'instantané pour la publication afin de générer un instantané mis à jour.

  4. 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 colonne pour un article publié dans une publication de fusion

  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. Dans la base de données de publication sur le serveur de publication, exécutez sp_mergearticlecolumn. Les colonnes à inclure ou à supprimer de l'article sont alors définies.

    • En cas de publication de quelques colonnes d'une table en contenant de nombreuses, exécutez sp_mergearticlecolumn une fois pour chaque colonne ajoutée. Spécifiez le nom de la colonne pour @column et affectez la valeur add à @operation.

    • En cas de publication de la plupart des colonnes d'une table en contenant de nombreuses, exécutez sp_mergearticlecolumn, en affectant la valeur null à @column et la valeur add à @operation pour ajouter toutes les colonnes. Exécutez ensuite sp_mergearticlecolumn, une fois pour chaque colonne qui est exclue, en affectant la valeur drop à @operation et le nom de la colonne exclue à @column.

Pour modifier un filtre de colonne de manière à inclure des colonnes supplémentaires pour un article publié dans une publication de fusion

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_mergearticlecolumn une fois pour chaque colonne ajoutée. Spécifiez le nom de colonne pour @column, affectez la valeur add à @operation et la valeur 1 à @force_invalidate_snapshot et à @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.

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

Pour modifier un filtre de colonne de manière à supprimer des colonnes pour un article publié dans une publication de fusion

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_mergearticlecolumn une fois pour chaque colonne supprimée. Spécifiez le nom de colonne pour @column, affectez la valeur drop à @operation et la valeur 1 à @force_invalidate_snapshot et à @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.

  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, la colonne DaysToManufacture est supprimée d'un article reposant sur la table Product.

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, la colonne CreditCardApprovalCode est supprimée d'un article reposant sur la table SalesOrderHeader.

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