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)

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, vea Filtros de fila con parámetros. 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

  • En la base de datos de publicación del publicador, 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, la expresión que define el filtro con parámetros para @value (sin incluir WHERE) y un valor de 1 para @force_invalidate_snapshot y @force_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

Este ejemplo define un grupo de artículos en una publicación de combinación, donde los artículos se filtran con una serie de filtros de combinación con la tabla Employee que 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 Filtros de fila con parámetros.

-- 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'AdventureWorks2008R2';
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 [AdventureWorks2008R2];

-- Enable AdventureWorks2008R2 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 AdventureWorks2008R2.', 
  @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