Cómo definir y modificar un filtro de fila estático (programación de la replicación con Transact-SQL)

Al crear los artículos de la tabla, puede definir una cláusula WHERE para filtrar las filas de un artículo. También puede cambiar un filtro de fila una vez definido. Los filtros de fila estáticos se pueden crear y modificar mediante programación con los procedimientos almacenados de la replicación. Dado que estos filtros son estáticos, todos los suscriptores recibirán el mismo subconjunto de los datos. Si necesita filtrar dinámicamente las filas en un artículo de la tabla que pertenece a una publicación de mezcla para que cada suscriptor reciba una partición diferente de los datos, vea Cómo definir y modificar un filtro de fila con parámetros para un artículo de mezcla (programación de la replicación con Transact-SQL). La replicación de mezcla también permite filtrar filas relacionadas con un filtro de filas existente. Para obtener más información, vea Cómo definir y modificar un filtro de combinación entre artículos de mezcla (programación de la replicación con Transact-SQL).

Para definir un filtro de fila estático para una publicación transaccional o de instantáneas

  1. Defina el artículo que se va a filtrar. Para obtener más información, vea Cómo definir un artículo (programación de la replicación con Transact-SQL).

  2. En la base de datos de publicación del publicador, ejecute sp_articlefilter (Transact-SQL). Especifique el nombre del artículo para @article, el nombre de la publicación para @publication, un nombre de filtro para @filter_namey la cláusula de filtrado para @filter_clause (no se incluye WHERE).

  3. Si todavía debe definirse un filtro de columna, vea Cómo definir y modificar un filtro de columna (programación de la replicación con Transact-SQL). De lo contrario, ejecute sp_articleview (Transact-SQL). Especifique el nombre de la publicación para @publication, el nombre del artículo filtrado para @articley la cláusula de filtro especificada en el paso 2 para @filter_clause. Esto crea los objetos de sincronización para el artículo filtrado.

Para modificar un filtro de fila estático para una publicación transaccional o de instantáneas

  1. En la base de datos de publicación del publicador, ejecute sp_articlefilter (Transact-SQL). Especifique el nombre del artículo para @article, el nombre de la publicación para @publication, un nombre de filtro nuevo para @filter_namey la cláusula de filtrado nueva para @filter_clause (no se incluye WHERE). Dado que este cambio invalidará los datos en las suscripciones existentes, especifique un valor de 1 para @force_reinit_subscription.

  2. En la base de datos de publicación del publicador, ejecute sp_articleview (Transact-SQL). Especifique el nombre de la publicación para @publication, el nombre del artículo filtrado para @articley la cláusula de filtro especificada en el paso 1 para @filter_clause. Esto vuelve a crear la vista que define 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. Para obtener más información, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).

  4. Reinicialice las suscripciones. Para obtener más información, vea Cómo reinicializar una suscripción (programación de la replicación con Transact-SQL).

Para eliminar un filtro de fila estático para una instantánea o una publicación transaccional

  1. En la base de datos de publicación del publicador, ejecute sp_articlefilter (Transact-SQL). Especifique el nombre del artículo para @article, el nombre de la publicación para @publication, un valor de NULL para @filter_namey un valor de NULL para @filter_clause. Dado que este cambio invalidará los datos en las suscripciones existentes, especifique un valor de 1 para @force_reinit_subscription.

  2. Vuelva a ejecutar el trabajo del Agente de instantáneas para que la publicación genere una instantánea actualizada. Para obtener más información, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).

  3. Reinicialice las suscripciones. Para obtener más información, vea Cómo reinicializar una suscripción (programación de la replicación con Transact-SQL).

Para definir un filtro de fila estático para una publicación de mezcla

  1. En la base de datos de publicación del publicador, ejecute sp_addmergearticle (Transact-SQL). Especifique la cláusula de filtrado para @subset_filterclause (sin incluir WHERE). Para obtener más información, vea Cómo definir un artículo (programación de la replicación con Transact-SQL).

  2. Si todavía debe definirse un filtro de columna, vea Cómo definir y modificar un filtro de columna (programación de la replicación con Transact-SQL).

Para modificar un filtro de fila estático para una publicación de mezcla

  1. En la base de datos de publicación del publicador, ejecute sp_changemergearticle (Transact-SQL). Especifique el nombre de la publicación para @publication, el nombre del artículo filtrado para @article, un valor de subset_filterclause para @propertyy la nueva cláusula de filtrado para @value (sin incluir WHERE). Dado que este cambio invalidará los datos en las suscripciones existentes, especifique un valor de 1 para @force_reinit_subscription.

  2. Vuelva a ejecutar el trabajo del Agente de instantáneas para que la publicación genere una instantánea actualizada. Para obtener más información, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).

  3. Reinicialice las suscripciones. Para obtener más información, vea Cómo reinicializar una suscripción (programación de la replicación con Transact-SQL).

Ejemplo

En este ejemplo de la replicación transaccional, el artículo se filtra horizontalmente para quitar todos los productos obsoletos.

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, los artículos se filtran horizontalmente para devolver sólo las filas que pertenecen al vendedor especificado. También se usa un filtro de combinación. Para obtener más información, vea Cómo definir y modificar un filtro de combinación entre artículos de mezcla (programación de la replicación con Transact-SQL).

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.EmployeeID = 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