Definir e modificar um filtro de linha parametrizado para um artigo de mesclagem

Aplica-se a:SQL Server

Este tópico mostra como definir e modificar um filtro de linha com parâmetros no SQL Server usando o SQL Server Management Studio ou o Transact-SQL.

Ao criar artigos de tabela, você pode usar filtros de linha com parâmetros. Esses filtros usam uma cláusula WHERE para selecionar os dados apropriados para serem publicados. Em vez de especificar um valor literal na cláusula (como você faria com um filtro de linha estático) você indica uma ou mais das seguintes funções do sistema: SUSER_SNAME e HOST_NAME. Para obter mais informações, consulte Filtros de linha com parâmetros.

Neste tópico

Antes de começar

Limitações e Restrições

  • Se você adicionar, modificar ou excluir um filtro de linha com parâmetros 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

  • Por motivos de desempenho, recomendamos que não sejam aplicadas funções a nomes de colunas em cláusulas de filtro de linha com parâmetros, como LEFT([MyColumn]) = SUSER_SNAME(). Se você usar HOST_NAME em uma cláusula de filtro e substituir o valor HOST_NAME, talvez precise converter tipos de dados usando CONVERT. Para obter mais informações sobre práticas recomendadas para esse caso, consulte a seção "Substituindo o valor de HOST_NAME()" no tópico Parameterized Row Filters.

Como usar o SQL Server Management Studio.

Defina, modifique e exclua filtros de linhas com parâmetros 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>. 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 linha com parâmetros

  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>, clique em Adicionar e clique em Adicionar Filtro.

  2. Na caixa de diálogo Adicionar Filtro , selecione uma tabela para filtrar na caixa de listagem suspensa.

  3. Crie uma instrução de filtro na caixa de texto Instrução de filtro . Você pode digitar diretamente na área de texto e também pode arrastar e soltar colunas da caixa de listagem Colunas .

    • A área de texto Instrução de filtro inclui o texto padrão que está no formato de:

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • O texto padrão não pode ser alterado; digite a cláusula de filtro depois da palavra-chave WHERE usando sintaxe padrão do SQL. Um filtro com parâmetros inclui uma chamada para a função de sistema HOST_NAME() e/ou SUSER_SNAME(), ou uma função definida pelo usuário que referencie uma ou ambas as funções. A seguir há um exemplo de uma cláusula de filtro completa para um filtro de linha com parâmetros:

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

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

  4. Selecione a opção que corresponde ao modo em que os dados serão compartilhados entre Assinantes:

    • Uma linha dessa tabela irá para múltiplas assinaturas

    • Uma linha dessa tabela irá para apenas uma assinatura

    Se você selecionar Uma linha desta tabela irá para apenas uma assinatura, a replicação de mesclagem pode otimizar o desempenho armazenando e processando uma quantia menor de metadados. No entanto, será necessário certificar-se de que os dados são particionados de forma que uma linha não seja replicada em mais de um Assinante. Para obter mais informações, consulte a seção "Configurando opções de partição" no tópico Parameterized Row Filters.

  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 linha com parâmetros

  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 Filtro , modifique o filtro.

  3. Selecione OK.

Para excluir um filtro de linha com parâmetros

  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.

Usando o Transact-SQL

Os filtros de linha com parâmetros podem ser criados e modificados de forma programada, usando os procedimentos de replicação armazenados.

Para definir um filtro de linha com parâmetros para um artigo em uma publicação de mesclagem

  1. No Publicador no banco de dados de publicação, execute o sp_addmergearticle (Transact-SQL). Especifique @publication, um nome de artigo para @article, a tabela sendo publicada para @source_object, a cláusula WHERE que define o filtro com parâmetros como @subset_filterclause (não incluindo WHERE) e um dos valores a seguir para @partition_options, que descreve o tipo de particionamento que resultará do filtro de linha com parâmetros:

    • 0 - A filtragem para o artigo ou é estática ou não gera um único subconjunto de dados para cada partição (uma partição “sobreposta”).

    • 1 = As partições resultantes são sobrepostas e as atualizações realizadas no Assinante não podem alterar a partição à qual uma linha pertence.

    • 2 - A filtragem para o artigo gera partições não sobrepostas, mas vários Assinantes podem receber a mesma partição.

    • 3 = A filtragem para o artigo gera partições não sobrepostas que são exclusivas para cada assinatura.

Para alterar um filtro de linha com parâmetros para um artigo em uma publicação de mesclagem

  1. No Publicador do banco de dados de publicação, execute sp_changemergearticle. Especifique @publication, @article, um valor de subset_filterclause para @property, the expression that defines the parameterized filter para @value (não incluindo WHERE) e um valor de 1 para both @parace_invalidate_snapshot e @parace_reinit_subscription.

  2. Se esta alteração resultar em um comportamento de particionamento diferente, execute então sp_changemergearticle novamente. Especifique @publication, @article, um valor de partition_options para @propertye a opção de particionamento mais adequada para @value, que pode ser uma das seguintes:

    • 0 - A filtragem para o artigo ou é estática ou não gera um único subconjunto de dados para cada partição (uma partição “sobreposta”).

    • 1 = As partições resultantes são sobrepostas e as atualizações realizadas no Assinante não podem alterar a partição à qual uma linha pertence.

    • 2 - A filtragem para o artigo gera partições não sobrepostas, mas vários Assinantes podem receber a mesma partição.

    • 3 = A filtragem para o artigo gera partições não sobrepostas que são exclusivas para cada assinatura.

Exemplo (Transact-SQL)

Esse exemplo define um grupo de artigos em uma publicação de mesclagem onde os artigos são filtrados por uma série de filtros de junção em relação à tabela Employee que, por sua vez, é filtrada usando um filtro de linha com parâmetros na coluna LoginID . Durante a sincronização, o valor retornado pela função HOST_NAME é substituído. Para obter mais informações, consulte Substituindo o valor do HOST_NAME () no tópico 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

Confira também

Definir e modificar um filtro de junção entre artigos de mesclagem
Alterar propriedades da publicação e do artigo
Filtros de junção
Parameterized Row Filters