sp_addmergefilter (Transact-SQL)
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 au niveau du serveur de publication dans la base de données de publication.
Syntaxe
sp_addmergefilter [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @filtername = ] 'filtername'
, [ @join_articlename = ] 'join_articlename'
, [ @join_filterclause = ] 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= ] 'publication'
Nom de la publication dans laquelle le filtre de fusion est ajouté. L'argument publication est de type sysname, sans valeur par défaut.[ @article= ] 'article'
Nom de l'article dans lequel le filtre de fusion est ajouté. L'argument article est de type sysname, sans valeur par défaut.[ @filtername= ] 'filtername'
Nom du filtre. L'argument filtername est un paramètre obligatoire. filtername est de type sysname et n'a pas de valeur par défaut.[ @join_articlename= ] 'join_articlename'
Article parent auquel l'article enfant, spécifié par l'argument article, doit être joint à l'aide de la clause de jointure spécifiée par l'argument join_filterclause, afin de déterminer les lignes de l'article enfant qui répondent au critère du filtre de fusion. L'argument join_articlename est de type sysname, sans valeur par défaut. L'article doit figurer dans la publication donnée par l'argument publication.[ @join_filterclause= ] join_filterclause
Clause de jointure qui doit être utilisée pour joindre l'article enfant spécifié par l'argument articleet l'article parent spécifié par l'argument join_article, afin de déterminer les lignes qualifiant le filtre de fusion. join_filterclause est de type nvarchar(1000).[ @join_unique_key= ] join_unique_key
Indique si l'article enfant article et l'article parent join_article sont de type un à plusieurs, un à un, plusieurs à un ou plusieurs à plusieurs. L'argument join_unique_key est de type int, avec pour valeur par défaut 0. La valeur 0 indique une jointure un à un ou un à plusieurs. La valeur 1 indique une jointure un à un ou un à plusieurs. Cette valeur est égale à 1 lorsque les colonnes de jointure forment une clé unique dans l'argument join_article ou si l'argument join_filterclause se trouve entre une clé étrangère dans article et une clé primaire dans join_article.Attention Définissez uniquement ce paramètre sur la valeur 1 si la colonne de jointure de la table sous-jacente fait l'objet d'une contrainte pour l'article parent qui garantit son caractère unique. Si le paramètre join_unique_key se voit attribuer la valeur 1 de manière inappropriée, une non-convergence des données peut se produire.
[ @force_invalidate_snapshot= ] force_invalidate_snapshot
Signale que l'action entreprise par cette procédure stockée peut invalider une capture instantanée existante. force_invalidate_snapshot est du type bit, avec 0 comme valeur par défaut.0 indique que les modifications apportées à l'article de fusion n'invalident pas la capture instantanée. Si la procédure stockée détecte que la modification requiert une nouvelle capture instantanée, une erreur est générée et aucune modification n'est effectuée.
1 indique que les modifications apportées à l'article de fusion peuvent entraîner l'invalidation de la capture instantanée. En outre, s'il existe déjà des abonnements nécessitant une nouvelle capture instantanée, cette valeur permet de marquer la capture instantanée existante comme obsolète et de générer une nouvelle capture instantanée.
[ @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 du type bit, avec 0 comme valeur par défaut.0 indique 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 est générée et aucune modification n'est effectuée.
1 indique que les modifications apportées à l'article de fusion entraînent la réinitialisation des abonnements existants et autorise la réinitialisation des abonnements.
[ @filter_type= ] filter_type
Spécifie le type de filtre à ajouter. L'argument filter_type est de type tinyint et peut prendre l'une des valeurs suivantes.Valeur
Description
1
Filtre de jointure uniquement. Nécessaire pour la prise en charge des Abonnés SQL Server Compact 3.5 SP1.
2
Uniquement relation logique.
3
Filtre de jointure et relation logique.
Pour plus d'informations, consultez Regroupements des modifications apportées à des lignes connexes à l'aide d'enregistrements logiques.
Valeurs des codes renvoyés
0 (succès) ou 1 (échec)
Notes
La procédure sp_addmergefilter est utilisée dans la réplication de fusion.
sp_addmergefilter peut être utilisé uniquement avec des articles de table. Les articles de vue et de vue indexée ne sont pas pris en charge.
Vous pouvez également l'utiliser pour ajouter une relation logique entre deux articles qui peuvent ou non avoir un filtre de jointure entre eux. filter_type permet d'indiquer 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 satisfaire à plusieurs exigences. Pour plus d'informations, consultez Regroupements des modifications apportées à des lignes connexes à l'aide d'enregistrements logiques.
Cette option est généralement utilisée pour un article qui fait référence à une clé étrangère dans une table de clés primaires publiée, et lorsque la table de clés primaires a un filtre défini dans cet 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 de filtre de jointure entre deux articles publiés, lorsque les tables source des deux articles partagent le même nom d'objet de table. Dans ce cas, la création du filtre de jointure échouera même si les deux tables sont détenues par des schémas différents et ont des noms d'article unique.
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é. Pour cela, elle évalue soit 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).
Exemple
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 du rôle de base de données fixe db_owner peuvent exécuter la procédure sp_addmergefilter.
Voir aussi