Procédure : définir une relation d'enregistrement logique entre des articles de table de fusion (programmation Transact-SQL de la réplication)

Notes

Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.

La réplication de fusion vous permet de définir une relation entre des lignes connexes dans des tables distinctes. Ces lignes peuvent ainsi être traitées comme une unité transactionnelle au cours de la synchronisation. Un enregistrement logique peut être défini entre deux articles qu'ils aient ou non une relation de filtre de jointure. Pour plus d'informations, consultez Regroupements des modifications apportées à des lignes connexes à l'aide d'enregistrements logiques. Vous pouvez spécifier par programme des relations d'enregistrements logiques entre des articles en utilisant des procédures stockées de réplication.

Pour définir une relation d'enregistrements logiques sans filtre de jointure associé

  1. Si la publication contient des articles filtrés, exécutez sp_helpmergepublication et notez la valeur de use_partition_groups dans le jeu de résultats.

    • Si la valeur est 1, les partitions précalculées sont déjà utilisées.

    • Si la valeur est 0, exécutez sp_changemergepublication au niveau du serveur de publication dans la base de données de publication. Affectez la valeur use_partition_groups à @property et la valeur true à @value.

      Notes

      Si la publication ne prend pas en charge les partitions précalculées, les enregistrements logiques ne peuvent pas être utilisés. Pour plus d'informations, consultez la section « Conditions requises à l'utilisation des partitions précalculées » dans la rubrique Optimisation des performances des filtres paramétrés avec des partitions précalculées.

    • Si la valeur est NULL, l'Agent de capture instantanée doit être exécuté pour générer la capture instantanée initiale de la publication.

  2. Si les articles qui constitueront l'enregistrement logique n'existent pas, exécutez sp_addmergearticle au niveau du serveur de publication dans la base de données de publication. Spécifiez l'une des options de détection et de résolution des conflits suivantes pour l'enregistrement logique :

    • Pour détecter et résoudre les conflits qui se produisent dans des lignes connexes de l'enregistrement logique, affectez la valeur true à @logical_record_level_conflict_detection et @logical_record_level_conflict_resolution.

    • Pour utiliser la détection et la résolution standard des conflits au niveau des lignes ou des colonnes, affectez la valeur false à @logical_record_level_conflict_detection et @logical_record_level_conflict_resolution, qui est la valeur par défaut.

  3. Répétez l'étape 2 pour chaque article qui constituera l'enregistrement logique. Vous devez utiliser la même option de détection et de résolution des conflits pour chaque article de l'enregistrement logique. Pour plus d'informations, consultez Détection et résolution des conflits dans les enregistrements logiques.

  4. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergefilter. Spécifiez @publication, le nom d'un article de la relation pour @article, le nom du deuxième article pour @join_articlename, le nom de la relation pour @filtername, une clause qui définit la relation entre les deux articles pour @join_filterclause, le type de jointure pour @join_unique_key et affectez l'une des valeurs suivantes à @filter_type :

    • 2 - définit une relation logique.

    • 3 - définit une relation logique avec un filtre de jointure.

    Notes

    Si aucun filtre de jointure n'est pas utilisé, la direction de la relation entre les deux articles n'est pas importante.

  5. Répétez l'étape 2 pour chaque relation d'enregistrement logique restante dans la publication.

Pour modifier la détection et la résolution des conflits pour les enregistrements logiques

  1. Pour détecter et résoudre les conflits qui se produisent dans des lignes connexes de l'enregistrement logique :

    • Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle. Affectez la valeur logical_record_level_conflict_detection à @property et la valeur true à @value. Affectez la valeur 1 à @force_invalidate_snapshot et @force_reinit_subscription.

    • Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle. Affectez la valeur logical_record_level_conflict_resolution à @property et la valeur true à @value. Affectez la valeur 1 à @force_invalidate_snapshot et @force_reinit_subscription.

  2. Pour utiliser la détection et la résolution standard des conflits au niveau des lignes ou des colonnes :

    • Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle. Affectez la valeur logical_record_level_conflict_detection à @property et la valeur false à @value. Affectez la valeur 1 à @force_invalidate_snapshot et @force_reinit_subscription.

    • Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergearticle. Affectez la valeur logical_record_level_conflict_resolution à @property et la valeur false à @value. Affectez la valeur 1 à @force_invalidate_snapshot et @force_reinit_subscription.

Pour supprimer une relation d'enregistrements logiques

  1. Dans la base de données de publication sur le serveur de publication, exécutez la requête suivante afin que des informations sur toutes les relations d'enregistrements logiques définies pour la publication spécifiée soient retournées :

    SELECT f.* FROM sysmergesubsetfilters AS f 
    INNER JOIN sysmergepublications AS p
    ON f.pubid = p.pubid WHERE p.[name] = @publication;
    

    Notez le nom de la relation d'enregistrements logiques en cours de suppression dans la colonne filtername du jeu de résultats.

    Notes

    Cette requête retourne les mêmes informations que sp_helpmergefilterToutefois, cette procédure stockée système retourne seulement des informations sur les relations d'enregistrements logiques qui sont également des filtres de jointure.

  2. Dans la base de données de publication sur le serveur de publication, exécutez sp_dropmergefilter. Spécifiez @publication, le nom de l'un des articles de la relation pour @article et le nom de la relation de l'étape 1 pour @filtername.

Exemple

Cet exemple active les partitions précalculées sur une publication existante et crée un enregistrement logique qui comprend les deux nouveaux articles des tables SalesOrderHeader et SalesOrderDetail.

-- Remove ON DELETE CASCADE from FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID;
-- logical records cannot be used with ON DELETE CASCADE. 
IF EXISTS (SELECT * FROM sys.objects 
WHERE name = 'FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID')
BEGIN
    ALTER TABLE [Sales].[SalesOrderDetail] 
    DROP CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] 
END

ALTER TABLE [Sales].[SalesOrderDetail]  
WITH CHECK ADD CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] 
FOREIGN KEY([SalesOrderID])
REFERENCES [Sales].[SalesOrderHeader] ([SalesOrderID])
GO

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);
DECLARE @partitionoption AS bit;
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'SalesOrderDetail'; 
SET @table2 = N'SalesOrderHeader'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Ensure that the publication uses precomputed partitions.
SET @partitionoption = (SELECT [use_partition_groups] FROM sysmergepublications 
    WHERE [name] = @publication);
IF @partitionoption <> 1
BEGIN
    EXEC sp_changemergepublication 
        @publication = @publication, 
        @property = N'use_partition_groups', 
        @value = 'true',
        @force_invalidate_snapshot = 1;
END  

-- 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.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema,
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderHeader table';

-- Add an article for the SalesOrderDetail table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderDetail table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80;

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

-- Create a logical record relationship that is also a merge join 
-- filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'LogicalRecord_SalesOrderHeader_SalesOrderDetail', 
  @join_articlename = @table2, 
  @join_filterclause = N'[SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]', 
  @join_unique_key = 1, 
  @filter_type = 3, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO