Procédure : définir et modifier un filtrage des lignes paramétrable pour un article de fusion (programmation Transact-SQL de la réplication)

Lorsque vous créez des articles de table, vous pouvez utiliser des filtrages des lignes paramétrables. Ces filtres utilisent une clause WHERE pour sélectionner les données appropriées à publier. Plutôt que de spécifier une valeur littérale dans la clause (comme dans un filtre de lignes statique), vous spécifiez l'une des deux fonctions système suivantes ou les deux : SUSER_SNAME et HOST_NAME. Pour plus d'informations, consultez Parameterized Row Filters. Les filtrages des lignes paramétrables peuvent être créés et modifiés par programme en utilisant des procédures stockées de réplication.

Pour définir un filtrage des lignes paramétrable pour un article dans une publication de fusion

  • Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergearticle (Transact-SQL). Spécifiez @publication, le nom de l'article pour @article, la table qui est publiée pour @source_object, la clause WHERE qui définit le filtre paramétrable pour @subset_filterclause (sans WHERE) et affectez l'une des valeurs suivantes à @partition_options, qui décrit le type de partitionnement qui résultera du filtrage des lignes paramétrable :

    • 0  - le filtrage de l'article est statique ou ne génère pas un sous-ensemble unique de données pour chaque partition (partition avec chevauchement).

    • 1 - les partitions obtenues se chevauchent et les mises à jour apportées au niveau de l'Abonné ne peuvent pas modifier la partition à laquelle une ligne appartient.

    • 2 - le filtrage de l'article génère des partitions qui ne se chevauchent pas, mais plusieurs Abonnés peuvent recevoir la même partition.

    • 3 - le filtrage de l'article génère des partitions qui ne se chevauchent pas et qui sont uniques pour chaque abonnement.

Pour modifier un filtrage des lignes paramétrable pour un article dans une publication de fusion

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle. Spécifiez @publication, @article, affectez la valeur subset_filterclause à @property, l'expression qui définit le filtre paramétrable à @value (sans WHERE) et la valeur 1 à @force_invalidate_snapshot et à @force_reinit_subscription.

  2. Si cette modification conduit à un comportement de partitionnement différent, exécutez de nouveau sp_changemergearticle. Spécifiez @publication, @article, affectez la valeur partition_options à @property et l'option de partitionnement la plus appropriée à @value, qui peut être l'une des suivantes :

    • 0  - le filtrage de l'article est statique ou ne génère pas un sous-ensemble unique de données pour chaque partition (partition avec chevauchement).

    • 1 - les partitions obtenues se chevauchent et les mises à jour apportées au niveau de l'Abonné ne peuvent pas modifier la partition à laquelle une ligne appartient.

    • 2 - le filtrage de l'article génère des partitions qui ne se chevauchent pas, mais plusieurs Abonnés peuvent recevoir la même partition.

    • 3 - le filtrage de l'article génère des partitions qui ne se chevauchent pas et qui sont uniques pour chaque abonnement.

Exemple

Cet exemple définit un groupe d'articles dans une publication de fusion où les articles sont filtrés à l'aide d'une série de filtres de jointure sur la Employee Table, qui est elle-même filtrée à l'aide d'un filtrage des lignes paramétrable sur la colonne LoginID. Pendant la synchronisation, la valeur retournée par la fonction HOST_NAME est remplacée. Pour plus d'informations, consultez la section « Substitution de la valeur de HOST_NAME() » dans la rubrique Filtres de lignes paramétrés.

-- 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'AdventureWorks';
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 [AdventureWorks];

-- Enable AdventureWorks 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 AdventureWorks.', 
  @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].[EmployeeID] = [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