Definir e modificar um filtro de junção entre artigos de mesclagem

Aplica-se a:SQL Server

Este tópico descreve como definir e modificar o filtro de junção usado entre artigos de mesclagem no SQL Server usando o SQL Server Management Studio ou o Transact-SQL. A replicação de mesclagem dá suporte a filtros de junção, que normalmente são usados em conjunto com filtros com parâmetros para estender o particionamento de tabela a outros artigos de tabela relacionados.

Neste tópico

Antes de começar

Limitações e Restrições

  • Para criar um filtro de junção, uma publicação deve conter pelo menos duas tabelas relacionadas. O filtro de junção estende um filtro de linha; por isso, é preciso definir o filtro de linha em uma tabela antes de poder estender o filtro de junção em outra tabela. Depois que um filtro de junção estiver definido, você poderá estender este filtro de junção com outro filtro de junção, se a publicação contiver tabelas relacionadas adicionais.

  • Se você adicionar, modificar ou excluir um filtro de junção após a inicialização de assinaturas na publicação, será preciso gerar um novo instantâneo e reinicializar todas as assinaturas depois de fazer a alteração. Para obter mais informações sobre os requisitos para alterações de propriedades, consulte Alterar propriedades da publicação e do artigo.

Recomendações

Como usar o SQL Server Management Studio.

Defina, modifique e exclua filtros de junção na página Filtrar Linhas da Tabela no Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades da Publicação – <Publicação>. Para obter mais informações sobre como usar o assistente e acessar a caixa de diálogo, consulte Criar uma publicação e Exibir e modificar as propriedades da publicação.

Para definir um filtro de junção

  1. Na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades da Publicação – <Publicação>, selecione um filtro de linha existente ou filtro de junção no painel Tabelas Filtradas.

  2. Clique em Adicionare depois, em Adicionar Junção para Estender o Filtro Selecionado.

  3. Crie a instrução de junção: selecione Usar o construtor para criar a instrução ou Gravar a instrução de junção manualmente.

    • Se você selecionar para usar o construtor, use as colunas na grade (Conjunção, Coluna da Tabela Filtrada, Operadore Coluna da Tabela Unida) para criar uma instrução de junção.

      Cada coluna da grade contém uma caixa de combinação suspensa que permite a seleção de duas colunas e um operador (=, <>, <=, <, >=, > e like). Os resultados são exibidos na área de texto Visualizar . Se a junção envolver mais de um par de colunas, selecione a conjunção (AND ou OR) na coluna Conjunção e, depois, insira mais duas colunas e um operador.

    • Se você selecionar para gravar a instrução manualmente, grave a instrução de junção na área de texto Instrução de Junção . Use as caixas de listagens Colunas da tabela filtrada e Colunas da tabela unida para arrastar e soltar colunas na área de texto Instrução de junção .

    • A Instrução de junção completa teria a seguinte aparência:

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

      A cláusula JOIN deve usar nomeação de duas partes; nomeação de três partes e nomeação de quatro partes não possuem suporte.

  4. Especifique opções de junção:

    • Se a coluna de união da tabela filtrada (tabela pai) for exclusiva, selecione Chave exclusiva.

      Cuidado

      A seleção dessa opção indica que a relação entre tabelas pai e filho em um filtro de junção é de um para um ou um para muitos. Só selecione essa opção se houver uma restrição na coluna de junção na tabela filho que garanta a exclusividade. Se a opção for definida incorretamente, poderá ocorrer não convergência de dados.

    • Por padrão, os processos de replicação de mesclagem são alterados em uma base de linha por linha durante a sincronização. Para processar as alterações relacionadas em linhas da tabela filtrada e da tabela unida como uma unidade, selecione Registro lógico (somente Microsoft SQL Server 2005 (9.x) e versões posteriores). Essa opção só estará disponível se os requisitos de artigo e publicação para uso de registros lógicos forem atendidos. Para obter mais informações, consulte a seção "Considerações para uso de registros lógicos" em Agrupar alterações a linhas relacionadas com registros lógicos.

  5. Selecione OK.

  6. Se você estiver na caixa de diálogo Propriedades da Publicação – <Publicação>, clique em OK para salvar e fechar a caixa de diálogo.

Para modificar um filtro de junção

  1. Na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas de Propriedades da Publicação – <Publicação>, selecione um filtro no painel Tabelas Filtradas e clique em Editar.

  2. Na caixa de diálogo Editar Junção , modifique o filtro.

  3. Selecione OK.

Para excluir um filtro de junção

  1. Na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas de Propriedades da Publicação – <Publicação>, selecione um filtro no painel Tabelas Filtradas e clique em Excluir. Caso o próprio filtro excluído seja estendido por outras junções, essas junções também serão excluídas.

Usando o Transact-SQL

Estes procedimentos mostram um filtro com parâmetros em um artigo pai com filtros de junção entre esse artigo e artigos filho relacionados. Os filtros de junção podem ser definidos e modificados programaticamente usando procedimentos armazenados de replicação.

Para definir um filtro de junção para estender um filtro de artigo a artigos relacionados em uma publicação de mesclagem

  1. Defina a filtragem para o artigo ao qual está sendo feita a junção, que é também conhecido como o artigo pai.

  2. No Publicador no banco de dados de publicação, execute sp_addmergearticle (Transact-SQL) para definir um ou mais artigos relacionados, que também são conhecidos como artigos filho, para a publicação. Para obter mais informações, consulte Define an Article.

  3. No Publicador no banco de dados de publicação, execute sp_addmergefilter (Transact-SQL). Especifique @publication, um nome exclusivo para esse filtro para @filtername, o nome do artigo filho criado na etapa 2 para @article, o nome do artigo pai ao qual é feita a junção para @join_articlename e um dos valores a seguir para @join_unique_key:

    • 0 - indica uma junção muitos para um ou muitos para muitos entre os artigos pai e filho.

    • 1 - indica uma junção um para um ou um para muitos entre os artigos pai e filho.

    Isso define um filtro de junção entre os dois artigos.

    Cuidado

    Somente defina @join_unique_key como 1 se você tiver uma restrição na coluna de junção na tabela subjacente para o artigo pai que garanta exclusividade. Se @join_unique_key for definido incorretamente como 1, poderá ocorrer não convergência de dados.

Exemplos (Transact-SQL)

Este exemplo define um artigo para uma publicação de mesclagem em que o artigo da tabela SalesOrderDetail é filtrado em relação à tabela SalesOrderHeader que, por sua vez, é filtrada usando um filtro de linha estático. Para obter mais informações, consulte Definir e modificar um filtro de linha estático.

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

Este exemplo define um grupo de artigos em uma publicação de mesclagem em que os artigos são filtrados com uma série de filtros de junção na tabela Employee que, por sua vez, é filtrada usando um filtro de linha com parâmetros sobre o valor de HOST_NAME na coluna LoginID . Para obter mais informações, consulte Definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem.

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

Confira também

Filtros de junção
Parameterized Row Filters
Alterar propriedades da publicação e do artigo
Filtrar dados publicados para a replicação de mesclagem
Como definir e modificar um filtro de junção entre artigos de mesclagem (SQL Server Management Studio)
Replication System Stored Procedures Concepts
Definir uma relação de registro lógico entre artigos da tabela de mesclagem
Definir e modificar um filtro de linha parametrizado para um artigo de mesclagem