Como definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem (Programação Transact-SQL de replicação)

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

  • No Publicador do banco de dados de publicação, execute 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 do 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, a expressão que define o filtro com parâmetros como @value (não incluindo WHERE) e um valor de 1 para ambos, @force_invalidate_snapshot e @force_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 @property e 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

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 unidos em uma 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 Filtro de linha com 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