Definir y modificar un filtro de fila con parámetros para un artículo de mezcla

Se aplica a:SQL Server

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

Al crear los artículos de la tabla, puede usar filtros de fila con parámetros. Estos filtros usan una cláusula WHERE para seleccionar los datos adecuados que se van a publicar. En vez de especificar un valor literal en la cláusula (como ocurre con un filtro de fila estático), se especifica una o las dos funciones del sistema siguientes: SUSER_SNAME y HOST_NAME. Para obtener más información, consulte Filtros de fila con parámetros.

En este tema

Antes de empezar

Limitaciones y restricciones

  • Si agrega, modifica o elimina un filtro de fila con parámetros 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).

Recomendaciones

  • Por motivos de rendimiento, se recomienda no aplicar funciones a los nombres de columna en las cláusulas de filtro de fila con parámetros, como LEFT([MyColumn]) = SUSER_SNAME(). Si utiliza HOST_NAME en una cláusula de filtro y reemplaza el valor HOST_NAME, puede que sea necesario convertir los tipos de datos utilizando CONVERT. Para obtener más información acerca de las prácticas recomendadas para este caso, vea la sección "Reemplazar el valor de HOST_NAME()" del tema Parameterized Row Filters.

Uso de SQL Server Management Studio

Defina, modifique y elimine filtros de fila con parámetros 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 con parámetros

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o la página Filtrar filas de Propiedades de la publicación: <Publicació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 va a filtrar en el cuadro de lista desplegable.

  3. Cree una instrucción para el filtro en el cuadro 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 .

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

      SELECT <published_columns> FROM [tableowner].[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. Un filtro con parámetros incluye una llamada a la función del sistema HOST_NAME() y/o SUSER_SNAME(), o una función definida por el usuario que hace referencia a una de estas funciones o a las dos. La línea siguiente es un ejemplo de una cláusula de filtro completa de un filtro de fila con parámetros:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

      La cláusula WHERE debe usar nombres de dos partes; los nombres de tres y cuatro partes no se admiten.

  4. Seleccione la opción que indique cómo se van a compartir los datos entre los suscriptores:

    • Una fila de esta tabla irá a varias suscripciones

    • Una fila de esta tabla irá a una sola suscripción

    Si selecciona Una fila de esta tabla irá a una sola suscripción, la replicación de mezcla puede optimizar el rendimiento almacenando y procesando menos metadatos. No obstante, debe asegurarse de que los datos se particionan de forma que una fila no se pueda replicar en más de un suscriptor. Para obtener más información, vea la sección sobre cómo configurar opciones de partición en el tema Parameterized Row Filters.

  5. Seleccione Aceptar.

  6. 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 con parámetros

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o la página Filtrar filas de 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 con parámetros

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o la página Filtrar filas de 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

Los filtros de fila con parámetros se pueden crear y modificar mediante programación con los procedimientos almacenados de la replicación.

Para definir un filtro de fila con parámetros para un artículo en una publicación de combinación

  1. En el publicador de la base de datos de publicación, ejecute sp_addmergearticle (Transact-SQL). Especifique @publication, un nombre para el artículo para @article, la tabla que está publicándose para @source_object, la cláusula WHERE que define el filtro con parámetros para @subset_filterclause (sin incluir WHERE) y uno de los valores siguientes para @partition_options, que describe el tipo de particionamiento que resultará del filtro de fila con parámetros:

    • 0 : El filtro del artículo es estático o no produce un subconjunto de datos único para cada partición (una partición "superpuesta").

    • 1 : Las particiones resultantes son superpuestas y las actualizaciones realizadas en el suscriptor no pueden cambiar la partición a la que pertenece la fila.

    • 2 : El filtro del artículo produce particiones no superpuestas, pero varios suscriptores pueden recibir la misma partición.

    • 3 : El filtro del artículo produce particiones no superpuestas que son únicas para cada suscripción.

Para cambiar un filtro de fila con parámetros para un artículo en una publicación de combinación

  1. En la base de datos de publicación del publicador, ejecute sp_changemergearticle. Especifique @publication, @article, un valor de subset_filterclause para @property, the expression that defines the parameterized filter para @value (sin incluir WHERE) y un valor de 1 para both @parace_invalidate_snapshot y @parace_reinit_subscription.

  2. Si este cambio produce un comportamiento de particionamiento diferente, a continuación, ejecute sp_changemergearticle de nuevo. Especifique @publication, @article, un valor de partition_options para @propertyy la opción de particionamiento más adecuada para @value, que puede ser una de lo siguientes:

    • 0 : El filtro del artículo es estático o no produce un subconjunto de datos único para cada partición (una partición "superpuesta").

    • 1 : Las particiones resultantes son superpuestas y las actualizaciones realizadas en el suscriptor no pueden cambiar la partición a la que pertenece la fila.

    • 2 : El filtro del artículo produce particiones no superpuestas, pero varios suscriptores pueden recibir la misma partición.

    • 3 : El filtro del artículo produce particiones no superpuestas que son únicas para cada suscripción.

Ejemplo (Transact-SQL)

En este ejemplo se define un grupo de artículos en una publicación de mezcla, donde los artículos se filtran con una serie de filtros de combinación con la tabla Employee que a su vez se filtra mediante un filtro de fila con parámetros en la columna LoginID . Durante la sincronización, el valor devuelto por la función HOST_NAME se invalida. Para obtener más información, vea Invalidar el valor de HOST_NAME() en el tema Parameterized Row Filters.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

Consulte también

Definir y modificar un filtro de combinación entre artículos de mezcla
Cambiar las propiedades de la publicación y de los artículos
Filtros de combinación
Filtros de fila con parámetros