Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Managed Instance
Voegt een nieuw mergefilter toe om een partitie te maken op basis van een join met een andere tabel. Deze opgeslagen procedure wordt uitgevoerd bij Publisher in de publicatiedatabase.
Transact-SQL syntaxis-conventies
Syntax
sys.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'publicatie'
De naam van de publicatie waarin het mergefilter wordt toegevoegd. @publication is sysname, zonder standaard.
[ @article = ] N'artikel'
De naam van het artikel waarop het mergefilter wordt toegevoegd. @article is sysname, zonder standaard.
[ @filtername = ] N'filternaam'
De naam van het filter. @filtername is een vereiste parameter. @filtername is een systeemnaam, zonder standaard.
[ @join_articlename = ] N'join_articlename'
Het ouderartikel waaraan het door @article gespecificeerde kindartikel wordt toegevoegd, moet worden toegevoegd met de join-clausule gespecificeerd door @join_filterclause, om de rijen in het kindartikel te bepalen die voldoen aan het filtercriterium van de mergefilter. @join_articlename is sysname, zonder standaard. Het artikel moet in de publicatie van @publication staan.
[ @join_filterclause = ] N'join_filterclause'
De join-clausule die gebruikt moet worden om het door @articlegespecificeerde kindartikel en het door @join_article gespecificeerde hoofdartikel te joinen, om de rijen te bepalen die het mergefilter kwalificeren. @join_filterclause is nvarchar(1000), zonder standaard.
[ @join_unique_key = ] join_unique_key
Specificeert of de join tussen kindartikel @article en ouderartikel @join_article één-op-velen, één-op-één, veel-op-één of veel-op-veel is.
@join_unique_key is int, met als standaard 0.
0duidt een veel-op-één of veel-op-veel join aan.1duidt een één-op-één of één-op-veel join aan.
Deze waarde is 1 wanneer de samenvoegende kolommen een unieke sleutel vormen in @join_article, of als @join_filterclause tussen een vreemde sleutel in @article en een primaire sleutel in @join_article ligt.
Caution
Stel deze parameter alleen in als 1 je een constraint hebt op de joining-kolom in de onderliggende tabel voor het ouderartikel die uniciteit garandeert. Als @join_unique_key verkeerd is ingesteld 1 , kan er niet-convergentie van data optreden.
[ @force_invalidate_snapshot = ] force_invalidate_snapshot
Erkent dat de actie die door deze opgeslagen procedure wordt uitgevoerd, een bestaande snapshot ongeldig kan maken.
@force_invalidate_snapshot is bit, met een standaardwaarde van 0.
0specificeert dat wijzigingen in het merge-artikel de snapshot niet ongeldig maken. Als de opgeslagen procedure detecteert dat de wijziging een nieuwe snapshot vereist, ontstaat er een fout en worden er geen wijzigingen aangebracht.1specificeert dat wijzigingen in het merge-artikel ervoor kunnen zorgen dat de snapshot ongeldig wordt, en als er bestaande abonnementen zijn die een nieuwe snapshot vereisen, geeft het toestemming om de bestaande snapshot als verouderd te markeren en een nieuwe snapshot te genereren.
[ @force_reinit_subscription = ] force_reinit_subscription
Erkent dat de actie die door deze opgeslagen procedure wordt ondernomen, mogelijk vereist dat bestaande abonnementen opnieuw worden geïntialiseerd.
@force_reinit_subscription is bit, met een standaardwaarde van 0.
0specificeert dat wijzigingen in het merge-artikel niet leiden tot het opnieuw initialiseren van het abonnement. Als de opgeslagen procedure detecteert dat de wijziging vereist dat abonnementen opnieuw geïnitialiseerd worden, treedt er een fout op en worden er geen wijzigingen aangebracht.1specificeert dat wijzigingen in het merge-artikel ervoor zorgen dat bestaande abonnementen opnieuw worden geïntialiseerd, en geeft toestemming voor de herinitialisatie van het abonnement.
[ @filter_type = ] filter_type
Specificeert het type filter dat wordt toegevoegd. @filter_type is tinyint en kan een van de volgende waarden zijn.
| Value | Description |
|---|---|
1 |
Alleen het joinfilter. Vereist om SQL Server Compact-abonnees te ondersteunen. |
2 |
Alleen logische registratierelatie. |
3 |
Zowel join, filter als logische recordrelatie. |
Zie Groepswijzigingen in gerelateerde rijen met logische records voor meer informatie.
Codewaarden retourneren
0 (geslaagd) of 1 (mislukt).
Remarks
sp_addmergefilter wordt gebruikt bij merge-replicatie.
sp_addmergefilter Kan alleen worden gebruikt met tabelartikelen. Artikelen over weergave en geïndexeerde weergave worden niet ondersteund.
Deze procedure kan ook worden gebruikt om een logische relatie toe te voegen tussen twee artikelen die mogelijk wel of niet een joinfilter tussen zich hebben. @filter_type wordt gebruikt om aan te geven of het mergefilter dat wordt toegevoegd een joinfilter is, een logische relatie, of beide.
Om logische gegevens te gebruiken, moeten de publicatie en artikelen aan verschillende vereisten voldoen. Zie Groepswijzigingen in gerelateerde rijen met logische records voor meer informatie.
Meestal wordt deze optie gebruikt voor een artikel dat een vreemde sleutel is als referentie voor een gepubliceerde primaire sleuteltabel, en de primaire sleuteltabel heeft een filter dat in het artikel is gedefinieerd. De subset van primaire sleutelrijen wordt gebruikt om de vreemde sleutelrijen te bepalen die worden gerepliceerd aan de abonnee.
Je kunt geen joinfilter toevoegen tussen twee gepubliceerde artikelen als de brontabellen van beide artikelen dezelfde tabelobjectnaam hebben. In zo'n geval mislukt het aanmaken van het joinfilter, zelfs als beide tabellen eigendom zijn van verschillende schema's en unieke artikelnamen hebben.
Wanneer zowel een geparametriseerd rijfilter als een joinfilter worden gebruikt op een tabelartikel, bepaalt replicatie of een rij thuishoort in de partitie van een abonnee. Dit gebeurt door ofwel de filterfunctie of de joinfilter te evalueren (met de OR-operator ), in plaats van de doorsnede van de twee condities te evalueren (met de EN-operator ).
Examples
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
Permissions
Alleen leden van de sysadmin-vaste serverrol of db_owner vaste databaserol kunnen uitvoeren sp_addmergefilter.