Definir y modificar un filtro de fila estático

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

En este tema

  • Antes de empezar:

    Limitaciones y restricciones

    Recomendaciones

  • Para definir y modificar un filtro de fila estático con:

    SQL Server Management Studio

    Transact-SQL

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 cambiar propiedades, vea 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

Icono de flecha usado con el vínculo Volver al principio[Top]

Usar SQL Server Management Studio

Defina, modifique y elimine filtros de fila 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 acerca de cómo usar el asistente y obtener acceso al cuadro de diálogo, vea 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 la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <publicación>, la acción que hay que realizar 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 Agregar y, a continuación, en Agregar filtro.

  2. En el cuadro de diálogo Agregar filtro, seleccione la tabla que desea 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, y arrastrar y colocar columnas desde el cuadro de lista Columnas.

    [!NOTA]

    La cláusula WHERE debe utilizar nombres con dos partes; no se admiten los nombres con tres o cuatro partes. 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 el siguiente formato:

      SELECT <published_columns> FROM [schema].[tablename] WHERE
      
    • El texto predeterminado no se puede modificar; escriba la cláusula del filtro después de la palabra clave WHERE, utilizando la sintaxis estándar de SQL. 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. Haga clic en Aceptar.

  5. Si está 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 haga clic en Editar.

  2. En el cuadro de diálogo Editar filtro, modifique el filtro.

  3. Haga clic en Aceptar.

Para eliminar un filtro de fila estático

  • 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 haga clic en Eliminar.

Icono de flecha usado con el vínculo Volver al principio[Top]

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 obtener más información, vea Definir un artículo.

  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 Definir y modificar un filtro de columna. 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 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 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 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 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 Definir un artículo.

  2. Si todavía debe definirse un filtro de columna, vea Definir y modificar un filtro de columna.

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

  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 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, vea 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

Icono de flecha usado con el vínculo Volver al principio[Top]

Vea también

Conceptos

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