Definir y modificar un filtro de fila estático

Se aplica a:SQL ServerAzure SQL Managed Instance

En este tema se describe cómo definir y modificar un filtro de fila estático en SQL Server mediante SQL Server Management Studio o Transact-SQL.

En este tema

Antes de empezar

Limitaciones y restricciones

  • Si agrega, modifica o elimina un filtro de fila estático una vez inicializadas las suscripciones a la publicación, deberá generar una instantánea nueva y reinicializar todas las suscripciones después de realizar 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).

  • Si la publicación está habilitada para la replicación transaccional punto a punto, no se pueden filtrar las tablas.

Recomendaciones

Uso de SQL Server Management Studio

Defina, modifique y elimine filtros de filas estáticos en la página Filtrar filas de tabla del Asistente para nueva publicación o en la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <Publicación>. Para obtener más información sobre el uso del asistente y el acceso al cuadro de diálogo, consulte Create a Publication (Crear una publicación) y Ver y modificar propiedades de publicación.

Para definir un filtro de fila estático

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o en la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <Publicación>, la acción que realice depende del tipo de publicación:

    • Para una publicación de instantáneas o transaccional, haga clic en Agregar.

    • Para una publicación de combinación, haga clic en Agregary, a continuación, en Agregar filtro.

  2. En el cuadro de diálogo Agregar filtro , seleccione la tabla que va a filtrar en el cuadro de lista desplegable.

  3. Cree una instrucción de filtro en el área de texto Instrucción de filtro . Puede escribir directamente en el área de texto o puede arrastrar y colocar columnas del cuadro de lista Columnas .

    Nota:

    La cláusula WHERE debe usar nombres de dos partes; los nombres de tres y cuatro partes no se admiten. Si la publicación es de un publicador de Oracle, la cláusula WHERE debe seguir la sintaxis de Oracle.

    • El área de texto Instrucción de filtro incluye el texto predeterminado, que tiene este formato:

      SELECT <published_columns> FROM [schema].[tablename] WHERE  
      
    • El texto predeterminado no se puede cambiar. Escriba la cláusula del filtro después de la palabra clave WHERE utilizando la sintaxis SQL estándar. La cláusula del filtro completa será similar a la siguiente:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE [LoginID] = 'adventure-works\ranjit0'  
      
    • Un filtro de fila estático puede incluir una función definida por el usuario. La cláusula del filtro completa para un filtro de fila estático con una función definida por el usuario será similar a la siguiente:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] WHERE MyFunction([Freight]) > 100  
      
  4. Seleccione Aceptar.

  5. Si se encuentra en el cuadro de diálogo Propiedades de la publicación: <Publicación>, haga clic en Aceptar para guardar y cerrar el cuadro de diálogo.

Para modificar un filtro de fila estático

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <Publicación>, seleccione un filtro en el panel Tablas filtradas y, a continuación, haga clic en Editar.

  2. Modifique el filtro en el cuadro de diálogo Editar filtro .

  3. Seleccione Aceptar.

Para eliminar un filtro de fila estático

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <Publicación>, seleccione un filtro en el panel Tablas filtradas y, a continuación, haga clic en Eliminar.

Usar 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.

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 más información, consulte Define an Article.

  2. En el publicador de la base de datos de publicación, 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 Define and Modify a Column Filter. 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 el publicador de la base de datos de publicación, 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 el publicador de la base de datos de publicación, 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 más información, consulte Crear y aplicar la instantánea inicial.

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

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

  1. En el publicador de la base de datos de publicación, 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 más información, consulte Crear y aplicar la instantánea inicial.

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

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

  1. En el publicador de la base de datos de publicación, ejecute sp_addmergearticle (Transact-SQL). Especifique la cláusula de filtrado para @subset_filterclause (sin incluir WHERE). Para más información, consulte Define an Article.

  2. Si todavía debe definirse un filtro de columna, vea Define and Modify a Column Filter.

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

  1. En el publicador de la base de datos de publicación, 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 más información, consulte Crear y aplicar la instantánea inicial.

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

Ejemplos (Transact-SQL)

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

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 solo las filas que pertenecen al vendedor especificado. También se usa un filtro de combinación. Para obtener más información, consulte Definir y modificar un filtro de combinación entre artículos de mezcla.

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

Definir y modificar un filtro de fila con parámetros para un artículo de mezcla
Cambiar las propiedades de la publicación y de los artículos
Filtrar datos publicados
Filtrar datos publicados para la replicación de mezcla