Definir y modificar un filtro de combinación entre artículos de mezcla

Se aplica a:SQL Server

En este tema se describe cómo definir y modificar un filtro de combinación entre artículos de combinación en SQL Server mediante SQL Server Management Studio o Transact-SQL. La replicación de mezcla admite filtros de combinación, que se usan normalmente junto con los filtros con parámetros para extender la partición de tabla a otros artículos de tabla relacionados.

En este tema

Antes de empezar

Limitaciones y restricciones

  • Para crear un filtro de combinación, una publicación debe contener dos tablas relacionadas, como mínimo. Un filtro de combinación amplía un filtro de fila. Por tanto, debe definir un filtro de fila en una tabla para poder extender el filtro con una combinación a otra. Una vez definido un filtro de combinación, puede extenderlo con otro si la publicación contiene más tablas relacionadas.

  • Si agrega, modifica o elimina un filtro de combinación 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

Uso de SQL Server Management Studio

Defina, modifique y elimine filtros de combinación 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 combinación

  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 de fila o un filtro de combinación existentes en el panel Tablas filtradas.

  2. Haga clic en Agregary, a continuación, en Agregar combinación para ampliar el filtro seleccionado.

  3. Cree la instrucción de combinación: seleccione Usar generador de instrucciones para crear la instrucción o Escribir instrucción de combinación manualmente.

    • Si selecciona utilizar el generador, utilice las columnas de la cuadrícula (Conjunción, Columna de tabla filtrada, Operadory Columna de tabla combinada) para generar una instrucción de combinación.

      Cada una de las columnas de la cuadrícula contiene un cuadro combinado desplegable que le permite seleccionar dos columnas y un operador (=, <>, <=, <, >=, > y like). Los resultados se muestran en el área de texto Vista previa . Si la combinación implica más de un par de columnas, seleccione una conjunción (AND u OR) de la columna Conjunción y, a continuación, especifique dos columnas más y un operador.

    • Si selecciona escribir la instrucción manualmente, escriba la instrucción de combinación en el área de texto Instrucción de combinación . Utilice los cuadros de lista Columnas de la tabla filtrada y Columnas de la tabla combinada para arrastrar y colocar columnas en el área de texto Instrucción de combinación .

    • La instrucción de combinación completa aparecerá así:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]  
      

      La cláusula JOIN debe utilizar nombres de dos partes; los nombres de tres o cuatro partes no se permiten.

  4. Especifique las opciones de combinación:

    • Si la columna en la que combina la tabla filtrada (la tabla principal) es exclusiva, seleccione Clave única.

      Precaución

      Al seleccionar esta opción indica que la relación entre la tabla principal y la secundaria de un filtro de combinación es de uno a uno o de uno a varios. Seleccione esta opción únicamente si tiene una restricción en la columna combinada en la tabla secundaria que garantiza la exclusividad. Si la opción no se establece correctamente, se podría producir la no convergencia de datos.

    • De manera predeterminada, la replicación de mezcla procesa los cambios fila a fila durante la sincronización. Para que los cambios relacionados de las filas de la tabla filtrada y de la tabla combinada se procesen como una unidad, seleccione Registro lógico (solo Microsoft SQL Server 2005 [9.x] y versiones posteriores). Esta opción solo está disponible si se cumplen los requisitos del artículo y de la publicación para utilizar registros lógicos. Para obtener más información, vea la sección sobre consideraciones para utilizar registros lógicos en el tema Agrupar cambios en filas relacionadas con registros lógicos.

  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 combinación

  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 combinación .

  3. Seleccione Aceptar.

Para eliminar un filtro de combinación

  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. Si el filtro de combinación que elimina está a su vez ampliado por otras combinaciones, esas combinaciones también se eliminarán.

Usar Transact-SQL

Estos procedimientos muestran un filtro con parámetros en un artículo primario con filtros de combinación entre este artículo y los artículos secundarios relacionados. Los filtros de combinación se pueden definir y modificar mediante programación con los procedimientos almacenados de la replicación.

Para definir un filtro de combinación para extender un filtro de artículo a los artículos relacionados en una publicación de combinación

  1. Defina el filtrado para el artículo con el que se combina, conocido también como artículo primario.

  2. En el publicador de la base de datos de publicación, ejecute sp_addmergearticle (Transact-SQL) para definir uno o más artículos relacionados, también conocidos como artículos secundarios, para la publicación. Para más información, consulte Define an Article.

  3. En el publicador de la base de datos de publicación, ejecute sp_addmergefilter (Transact-SQL). Especifique @publication, un nombre único de este filtro para @filtername, el nombre del artículo secundario creado en el paso 2 para @article, el nombre del artículo primario con el que se combina para @join_articlename y uno de los valores siguientes para @join_unique_key:

    • 0 - indica una combinación de varios a uno o de varios a varios entre los artículos primarios y secundarios.

    • 1 - indica una combinación de uno a uno o de uno a varios entre los artículos primarios y secundarios.

    Esto define un filtro de combinación entre los dos artículos.

    Precaución

    Establezca @join_unique_key en 1 solo si tiene una restricción en la columna de combinación de la tabla subyacente del artículo primario que garantice su unicidad. Si @join_unique_key se establece en 1 de manera incorrecta, se puede producir una no convergencia de datos.

Ejemplos (Transact-SQL)

En este ejemplo se define un artículo para una publicación de combinación, donde el artículo de tabla SalesOrderDetail se filtra respecto a la tabla SalesOrderHeader que se filtra a su vez con un filtro de fila estático. Para más información, consulte Define and Modify a Static Row Filter.

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

En este ejemplo se 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 respecto a la tabla Employee , que se filtra a su vez mediante un filtro de fila con parámetros en el valor de HOST_NAME , en la columna LoginID . Para más información, consulte Definir y modificar un filtro de fila con parámetros para un artículo de mezcla.

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

Filtros de combinación
Filtros de fila con parámetros
Cambiar las propiedades de la publicación y de los artículos
Filtrar datos publicados para la replicación de mezcla
Procedimiento para definir y modificar un filtro de combinación entre artículos de mezcla (SQL Server Management Studio)
Conceptos de procedimientos almacenados del sistema de replicación
Definir una relación de registros lógicos entre artículos de tabla de mezcla
Definir y modificar un filtro de fila con parámetros para un artículo de mezcla