Definir y modificar un filtro de columna

Se aplica a:SQL ServerAzure SQL Managed Instance

En este tema se explica cómo definir y modificar un filtro de columna en SQL Server mediante SQL Server Management Studio o Transact-SQL.

En este tema

Antes de empezar

Limitaciones y restricciones

  • Algunas columnas no se pueden filtrar. Para obtener más información, vea Filtrar datos publicados. Si modifica un filtro de columna después de que las suscripciones se hayan inicializado, deberá generar una nueva instantánea y reinicializar todas las suscripciones después de efectuar el cambio. Para obtener más información sobre los requisitos para los cambios de propiedad, consulte Cambiar las propiedades de la publicación y de los artículos (Cambiar las propiedades de la publicación y de los artículos).

Uso de SQL Server Management Studio

Defina los filtros de columna en la página Artículos del Asistente para nueva publicación. Para obtener más información sobre cómo usar el Asistente para nueva publicación, vea Crear una publicación.

Defina y modifique los filtros de columna en la página Artículos del cuadro de diálogo Propiedades de la publicación: <Publicación>. Para obtener más información sobre cómo cambiar las propiedades de la publicación, vea Ver y modificar propiedades de publicación.

Para definir un filtro de columna

  1. En la página Artículos del Asistente para nueva publicación, expanda la tabla que se va a filtrar en el panel Objetos para publicar .

  2. Desactive la casilla situada junto a cada columna que desee filtrar.

Para modificar filtros de columna

  1. En la página Artículos del cuadro de diálogo Propiedades de la publicación: <Publicación>, expanda la tabla que quiere filtrar en el panel Objetos que se van a publicar.

  2. Desactive la casilla situada junto a cada columna que desee filtrar y asegúrese de que activa las casillas de las columnas que se deben incluir en el artículo.

  3. Seleccione Aceptar.

Usar Transact-SQL

Al crear los artículos de la tabla, puede definir qué columnas desea incluir en el artículo y cambiar las columnas una vez definido el artículo. Puede crear y modificar columnas filtradas mediante programación usando los procedimientos almacenados de replicación.

Nota:

Los procedimientos siguientes suponen que la tabla subyacente no ha cambiado. Para obtener información sobre la replicación de los cambios del lenguaje de definición de datos (DDL) a tablas publicadas, vea Realizar cambios de esquema en bases de datos de publicaciones.

Para definir un filtro de columna para un artículo publicado en una instantánea o publicación transaccional

  1. Defina el artículo que se va a filtrar. Para más información, consulte Define an Article.

  2. En la base de datos de publicación del publicador, ejecute sp_articlecolumn. Esto define las columnas que se van a incluir o quitar del artículo.

    • Si se publican solo unas columnas de una tabla con muchas columnas, ejecute sp_articlecolumn una vez para cada columna que se está agregando. Especifique el nombre de la columna para @column y un valor de add para @operation.

    • Si se publica la mayoría de las columnas en una tabla con muchas columnas, ejecute sp_articlecolumn, especificando un valor de null para @column y un valor de add para @operation para agregar todas las columnas. A continuación, ejecute sp_articlecolumn, una vez para cada columna que se está excluyendo, especificando un valor de drop para @operation y el nombre de columna excluida para @column.

  3. En la base de datos de publicación del publicador, ejecute sp_articleview. Especifique el nombre de la publicación para @publication y el nombre del artículo filtrado para @article. Esto crea los objetos de sincronización para el artículo filtrado.

Para cambiar un filtro de columna para que incluya las columnas adicionales para un artículo publicado en una instantánea o publicación transaccional

  1. En la base de datos de publicación del publicador, ejecute sp_articlecolumn para cada columna que se está agregando. Especifique el nombre de la columna para @column y un valor de add para @operation.

  2. En la base de datos de publicación del publicador, ejecute sp_articleview. Especifique el nombre de la publicación para @publication y el nombre del artículo filtrado para @article. Si la publicación tiene suscripciones existentes, especifique un valor de 1 para @change_active. Esto vuelve a crear los objetos de sincronización para el artículo filtrado.

  3. Vuelva a ejecutar el trabajo del Agente de instantáneas para que la publicación genere una instantánea actualizada.

  4. Reinicialice las suscripciones. Para obtener más información, vea Reinicializar suscripciones.

Para cambiar un filtro de columna para quitar columnas para un artículo publicado en una instantánea o publicación transaccional

  1. En la base de datos de publicación del publicador, ejecute sp_articlecolumn para cada columna que se está quitando. Especifique el nombre de la columna para @column y un valor de drop para @operation.

  2. En la base de datos de publicación del publicador, ejecute sp_articleview. Especifique el nombre de la publicación para @publication y el nombre del artículo filtrado para @article. Si la publicación tiene suscripciones existentes, especifique un valor de 1 para @change_active. Esto vuelve a crear los objetos de sincronización para el artículo filtrado.

  3. Vuelva a ejecutar el trabajo del Agente de instantáneas para que la publicación genere una instantánea actualizada.

  4. Reinicialice las suscripciones. Para obtener más información, vea Reinicializar suscripciones.

Para definir un filtro de columna para un artículo publicado en una publicación de combinación

  1. Defina el artículo que se va a filtrar. Para más información, consulte Define an Article.

  2. En la base de datos de publicación del publicador, ejecute sp_mergearticlecolumn. Esto define las columnas que se van a incluir o quitar del artículo.

    • Si se publican solo unas columnas de una tabla con muchas columnas, ejecute sp_mergearticlecolumn una vez para cada columna que se está agregando. Especifique el nombre de la columna para @column y un valor de add para @operation.

    • Si se publica la mayoría de las columnas en una tabla con muchas columnas, ejecute sp_mergearticlecolumn, especificando un valor de null para @column y un valor de add para @operation para agregar todas las columnas. A continuación, ejecute sp_mergearticlecolumn, una vez para cada columna que se está excluyendo, especificando un valor de drop para @operation y el nombre de columna excluida para @column.

Para cambiar un filtro de columna para que incluya columnas adicionales para un artículo publicado en una publicación de combinación

  1. En la base de datos de publicación del publicador, ejecute sp_mergearticlecolumn para cada columna que se está agregando. Especifique el nombre de la columna para @column, un valor de add para @operation y un valor de 1 para @force_invalidate_snapshot y @force_reinit_subscription.

  2. Vuelva a ejecutar el trabajo del Agente de instantáneas para que la publicación genere una instantánea actualizada.

  3. Reinicialice las suscripciones. Para obtener más información, vea Reinicializar suscripciones.

Para cambiar un filtro de columna para quitar columnas para un artículo publicado en una publicación de combinación

  1. En la base de datos de publicación del publicador, ejecute sp_mergearticlecolumn para cada columna que se está quitando. Especifique el nombre de la columna para @column, un valor de drop para @operation y un valor de 1 para @force_invalidate_snapshot y @force_reinit_subscription.

  2. Vuelva a ejecutar el trabajo del Agente de instantáneas para que la publicación genere una instantánea actualizada.

  3. Reinicialice las suscripciones. Para obtener más información, vea Reinicializar suscripciones.

Ejemplo (Transact-SQL)

En este ejemplo de replicación transaccional, la columna DaysToManufacture se quita de un artículo basado en la tabla 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

En este ejemplo de replicación de mezcla, la columna CreditCardApprovalCode se quita de un artículo basado en la tabla 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

Consulte también

Cambiar las propiedades de la publicación y de los artículos
Filtrar datos publicados
Filtrar datos publicados para la replicación de mezcla