Compartir a través de


sp_addmergefilter (Transact-SQL)

Se aplica a: SQL Server Azure SQL Managed Instance

Agrega un nuevo filtro de mezcla para crear una partición basada en una combinación con otra tabla. Este procedimiento almacenado se ejecuta en el publicador de la base de datos de publicación.

Convenciones de sintaxis de Transact-SQL

Sintaxis

sp_addmergefilter
    [ @publication = ] N'publication'
    , [ @article = ] N'article'
    , [ @filtername = ] N'filtername'
    , [ @join_articlename = ] N'join_articlename'
    , [ @join_filterclause = ] N'join_filterclause'
    [ , [ @join_unique_key = ] join_unique_key ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]
    [ , [ @filter_type = ] filter_type ]
[ ; ]

Argumentos

[ @publication = ] N'publication'

Nombre de la publicación en la que se agrega el filtro de combinación. @publication es sysname, sin ningún valor predeterminado.

[ @article = ] N'article'

Nombre del artículo en el que se va a agregar el filtro de combinación. @article es sysname, sin ningún valor predeterminado.

[ @filtername = ] N'filtername'

Nombre del filtro. @filtername es un parámetro obligatorio. @filtername es sysname, sin ningún valor predeterminado.

[ @join_articlename = ] N'join_articlename'

El artículo primario al que se debe unir el artículo secundario, especificado por @article, mediante la cláusula join especificada por @join_filterclause, para determinar las filas del artículo secundario que cumplen el criterio de filtro del filtro de combinación. @join_articlename es sysname, sin ningún valor predeterminado. El artículo debe estar en la publicación dada por @publication.

[ @join_filterclause = ] N'join_filterclause'

Cláusula join que se debe usar para unirse al artículo secundario especificado por @articley artículo primario especificado por @join_article, para determinar las filas que califican el filtro de combinación. @join_filterclause es nvarchar(1000), sin ningún valor predeterminado.

[ @join_unique_key = ] join_unique_key

Especifica si la combinación entre el artículo secundario @article y el artículo primario @join_article es uno a varios, uno a uno, varios a uno o varios a varios. @join_unique_key es int, con un valor predeterminado de 0.

  • 0 indica una combinación de varios a uno o varios a varios.

  • 1 indica una combinación uno a uno o uno a varios.

Este valor es 1 cuando las columnas de combinación forman una clave única en @join_article, o si @join_filterclause está entre una clave externa en @article y una clave principal en @join_article.

Precaución

Establezca este parámetro 1 solo en si tiene una restricción en la columna de combinación de la tabla subyacente del artículo primario que garantiza la unicidad. Si @join_unique_key se establece 1 en incorrectamente, puede producirse una no convergencia de datos.

[ @force_invalidate_snapshot = ] force_invalidate_snapshot

Confirma que la acción realizada por este procedimiento almacenado podría invalidar una instantánea existente. @force_invalidate_snapshot es bit, con un valor predeterminado de 0.

  • 0 especifica que los cambios realizados en el artículo de combinación no hacen que la instantánea no sea válida. Si el procedimiento almacenado detecta que el cambio requiere una nueva instantánea, se producirá un error y no se realizarán cambios.

  • 1 especifica que los cambios realizados en el artículo de combinación pueden hacer que la instantánea no sea válida y, si hay suscripciones existentes que requerirían una nueva instantánea, concede permiso para que la instantánea existente se marque como obsoleta y se genere una nueva instantánea.

[ @force_reinit_subscription = ] force_reinit_subscription

Confirma que la acción realizada por este procedimiento almacenado puede requerir la reinicialización de las suscripciones existentes. @force_reinit_subscription es bit, con un valor predeterminado de 0.

  • 0 especifica que los cambios realizados en el artículo de combinación no hacen que se reinicialice la suscripción. Si el procedimiento almacenado detecta que el cambio requiere la reinicialización de suscripciones, se producirá un error y no se realizarán cambios.

  • 1 especifica que los cambios realizados en el artículo de combinación hacen que se reinicialicen las suscripciones existentes y se concede permiso para que se produzca la reinicialización de la suscripción.

[ @filter_type = ] filter_type

Especifica el tipo de filtro que se agrega. @filter_type es tinyint y puede ser uno de los siguientes valores.

Valor Descripción
1 Solo filtro de combinación. Necesario para admitir suscriptores de SQL Server Compact.
2 Solo relación de registros lógicos.
3 Filtro de combinación y relación de registros lógicos.

Para más información, vea Agrupar cambios en filas relacionadas con registros lógicos.

Valores de código de retorno

0 (correcto) o 1 (erróneo).

Comentarios

sp_addmergefilter se usa en la replicación de mezcla.

sp_addmergefilter solo se puede usar con artículos de tabla. No se admiten los artículos de vista e indización.

Este procedimiento también se puede usar para agregar una relación lógica entre dos artículos que podrían o no tener un filtro de combinación entre ellos. @filter_type se usa para especificar si el filtro de combinación que se va a agregar es un filtro de combinación, una relación lógica o ambos.

Para usar registros lógicos, la publicación y los artículos deben cumplir varios requisitos. Para más información, vea Agrupar cambios en filas relacionadas con registros lógicos.

Normalmente, esta opción se usa para un artículo que es una referencia de clave externa a una tabla de clave principal publicada y la tabla de clave principal tiene un filtro definido en su artículo. El subconjunto de filas de clave principal se usa para determinar las filas de clave externa que se replican en el suscriptor.

No se puede agregar un filtro de combinación entre dos artículos publicados cuando las tablas de origen de ambos artículos comparten el mismo nombre de objeto de tabla. En tal caso, incluso si ambas tablas son propiedad de esquemas diferentes y tienen nombres de artículo únicos, se produce un error en la creación del filtro de combinación.

Cuando se utilizan un filtro de combinación y un filtro de fila con parámetros en un artículo de tabla, la replicación determina si una fila pertenece a una partición de suscriptor. Para ello, evalúa la función de filtrado o el filtro de combinación (mediante el operador OR ), en lugar de evaluar la intersección de las dos condiciones (mediante el operador AND ).

Ejemplos

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.EmployeeID = 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

Permisos

Solo los miembros del rol fijo de servidor sysadmin o db_owner rol fijo de base de datos pueden ejecutar sp_addmergefilter.