Partager via


sp_addmergefilter (Transact-SQL)

S’applique à : SQL Server Azure SQL Managed Instance

Ajoute un nouveau filtre de fusion pour créer une partition basée sur une jointure avec une autre table. Cette procédure stockée est exécutée sur le serveur de publication dans la base de données de publication.

Conventions de la syntaxe Transact-SQL

Syntaxe

sp_addmergefilter
    [ @publication = ] N'publication'
    , [ @article = ] N'article'
    , [ @filtername = ] N'filtername'
    , [ @join_articlename = ] N'join_articlename'
    , [ @join_filterclause = ] N'join_filterclause'
    [ , [ @join_unique_key = ] join_unique_key ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]
    [ , [ @filter_type = ] filter_type ]
[ ; ]

Arguments

[ @publication = ] N’publication'

Nom de la composition dans laquelle le filtre de fusion est ajouté. @publication est sysname, sans valeur par défaut.

[ @article = ] N’article'

Nom de l’article sur lequel le filtre de fusion est ajouté. @article est sysname, sans valeur par défaut.

[ @filtername = ] N’filtername'

Nom du filtre. @filtername est un paramètre obligatoire. @filtername est sysname, sans valeur par défaut.

[ @join_articlename = ] N’join_articlename'

L’article parent auquel l’article enfant, spécifié par @article, doit être joint à l’aide de la clause de jointure spécifiée par @join_filterclause, pour déterminer les lignes de l’article enfant qui répondent au critère de filtre du filtre de fusion. @join_articlename est sysname, sans valeur par défaut. L’article doit être dans la publication donnée par @publication.

[ @join_filterclause = ] N’join_filterclause'

Clause de jointure qui doit être utilisée pour joindre l’article enfant spécifié par @articleet l’article parent spécifié par @join_article, pour déterminer les lignes qui qualifient le filtre de fusion. @join_filterclause est nvarchar(1000), sans valeur par défaut.

[ @join_unique_key = ] join_unique_key

Spécifie si la jointure entre l’article enfant @article et l’article parent @join_article est un-à-plusieurs, un-à-un, plusieurs-à-un ou plusieurs-à-plusieurs. @join_unique_key est int, avec la valeur par défaut 0.

  • 0 indique une jointure plusieurs-à-un ou plusieurs-à-plusieurs.

  • 1 indique une jointure un-à-un ou un-à-plusieurs.

Cette valeur est 1 lorsque les colonnes de jointure forment une clé unique dans @join_article, ou si @join_filterclause est entre une clé étrangère dans @article et une clé primaire dans @join_article.

Attention

Définissez ce paramètre 1 uniquement si vous avez une contrainte sur la colonne de jointure dans la table sous-jacente de l’article parent qui garantit l’unicité. Si @join_unique_key est défini 1 de manière incorrecte, la non-convergence des données peut se produire.

[ @force_invalidate_snapshot = ] force_invalidate_snapshot

Reconnaît que l’action effectuée par cette procédure stockée peut invalider un instantané existant. @force_invalidate_snapshot est bit, avec la valeur par défaut 0.

  • 0 spécifie que les modifications apportées à l’article de fusion n’entraînent pas l’invalidation de l’instantané. Si la procédure stockée détecte que la modification requiert un nouvel instantané, une erreur se produit et aucune modification n'est effectuée.

  • 1 spécifie que les modifications apportées à l’article de fusion peuvent entraîner l’échec de l’instantané et, s’il existe des abonnements existants qui nécessitent un nouvel instantané, donne l’autorisation de marquer l’instantané existant comme obsolète et un nouvel instantané généré.

[ @force_reinit_subscription = ] force_reinit_subscription

Confirme que l'action entreprise par cette procédure stockée peut nécessiter la réinitialisation des abonnements existants. @force_reinit_subscription est bit, avec la valeur par défaut 0.

  • 0 spécifie que les modifications apportées à l’article de fusion n’entraînent pas la réinitialisation de l’abonnement. Si la procédure stockée détecte que la modification requiert la réinitialisation des abonnements, une erreur se produit et aucune modification n'est effectuée.

  • 1 spécifie que les modifications apportées à l’article de fusion entraînent la réinitialisation des abonnements existants et autorisent la réinitialisation de l’abonnement.

[ @filter_type = ] filter_type

Spécifie le type de filtre à ajouter. @filter_type est tinyint et peut être l’une des valeurs suivantes.

Valeur Description
1 Filtre de jointure uniquement. Requis pour prendre en charge les abonnés SQL Server Compact.
2 Uniquement relation logique.
3 Filtre de jointure et relation logique.

Pour plus d’informations, consultez Regrouper les modifications apportées à des lignes connexes à l’aide d’enregistrements logiques.

Valeurs des codes de retour

0 (réussite) or 1 (échec).

Notes

sp_addmergefilter est utilisé dans la réplication de fusion.

sp_addmergefilter ne peut être utilisé qu’avec des articles de table. Les articles d’affichage et d’affichage indexés ne sont pas pris en charge.

Cette procédure peut également être utilisée pour ajouter une relation logique entre deux articles susceptibles ou non d’avoir un filtre de jointure entre eux. @filter_type est utilisé pour spécifier si le filtre de fusion ajouté est un filtre de jointure, une relation logique ou les deux.

Pour utiliser des enregistrements logiques, la publication et les articles doivent répondre à plusieurs exigences. Pour plus d’informations, consultez Regrouper les modifications apportées à des lignes connexes à l’aide d’enregistrements logiques.

En règle générale, cette option est utilisée pour un article qui est une référence à une clé étrangère à une table de clés primaires publiée, et la table de clés primaires a un filtre défini dans son article. Le sous-ensemble de lignes de clés primaires est utilisé pour déterminer les lignes de clés étrangères répliquées côté abonné.

Vous ne pouvez pas ajouter un filtre de jointure entre deux articles publiés lorsque les tables sources des deux articles partagent le même nom d’objet de table. Dans ce cas, même si les deux tables appartiennent à différents schémas et ont des noms d’articles uniques, la création du filtre de jointure échoue.

Lorsqu'un filtre de lignes paramétrable et un filtre de jointure sont tous deux utilisés sur un article de table, la réplication détermine si une ligne appartient à une partition de l'abonné. Il le fait en évaluant la fonction de filtrage ou le filtre de jointure (à l’aide de l’opérateur OR ), plutôt que d’évaluer l’intersection des deux conditions (à l’aide de l’opérateur AND ).

Exemples

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

autorisations

Seuls les membres du rôle serveur fixe sysadmin ou db_owner rôle de base de données fixe peuvent s’exécuter sp_addmergefilter.