sp_addmergefilter (Transact-SQL)
Aggiunge un nuovo filtro di merge per la creazione di una partizione in base a un join con un'altra tabella. Questa stored procedure viene eseguita nel database di pubblicazione del server di pubblicazione.
Sintassi
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 ]
Argomenti
[ @publication= ] 'publication'
Nome della pubblicazione nella quale viene aggiunto il filtro di merge. publication è di tipo sysname e non prevede alcun valore predefinito.[ @article= ] 'article'
Nome dell'articolo nel quale viene aggiunto il filtro di merge. article è di tipo sysname e non prevede alcun valore predefinito.[ @filtername= ] 'filtername'
Nome del filtro. filtername è un parametro obbligatorio. filtername è di tipo sysname e non prevede alcun valore predefinito.[ @join_articlename= ] 'join_articlename'
Articolo padre al quale l'articolo figlio specificato da article deve essere unito tramite la clausola join specificata da join_filterclause per determinare le righe dell'articolo figlio che soddisfano il criterio del filtro di merge. join_articlename è di tipo sysname e non prevede alcun valore predefinito. L'articolo deve essere incluso nella pubblicazione specificata da publication.[ @join_filterclause= ] join_filterclause
Clausola join che deve essere utilizzata per unire l'articolo figlio specificato da article e l'articolo padre specificato da join_article per determinare le righe che soddisfano il filtro di merge. join_filterclause è di tipo nvarchar(1000).[ @join_unique_key= ] join_unique_key
Specifica se il join tra l'articolo figlio specificato da article e l'articolo padre specificato da join_article è di tipo uno-a-molti, uno-a-uno, molti-a-uno oppure molti-a-molti. join_unique_key è di tipo int e il valore predefinito è NULL. 0 indica un join di tipo molti-a-uno o molti-a-molti. 1 indica un join di tipo uno-a-uno o uno-a-molti. Questo valore è 1 se le colonne unite tramite join formano una chiave univoca in join_article oppure se la clausola di filtro specificata da join_filterclause viene applicata tra una chiave esterna in article e una chiave primaria in join_article.Attenzione Impostare questo parametro su 1 solo se l'univocità è garantita da un vincolo nella colonna unita tramite join nella tabella sottostante per l'articolo padre. Se join_unique_key è impostato su 1 in modo errato, è possibile che si verifichi la non convergenza dei dati.
[ @force_invalidate_snapshot= ] force_invalidate_snapshot
Segnala che l'azione eseguita da questa stored procedure potrebbe invalidare uno snapshot esistente. force_invalidate_snapshot è di tipo bit e il valore predefinito è 0.0 specifica che le modifiche dell'articolo di merge non invalidano lo snapshot. Se la stored procedure rileva che la modifica richiede un nuovo snapshot, viene generato un errore e non viene apportata alcuna modifica.
1 specifica che le modifiche apportate all'articolo di merge potrebbero invalidare lo snapshot e, se sono disponibili sottoscrizioni che richiedono un nuovo snapshot, consente di contrassegnare lo snapshot esistente come obsoleto e di generarne uno nuovo.
[ @force_reinit_subscription= ] force_reinit_subscription
Segnala che l'azione eseguita dalla stored procedure potrebbe richiedere la reinizializzazione delle sottoscrizioni esistenti. force_reinit_subscription è di tipo bit e il valore predefinito è 0.0 specifica che le modifiche dell'articolo di merge non richiedono la reinizializzazione della sottoscrizione. Se la stored procedure rileva che la modifica richiede la reinizializzazione delle sottoscrizioni, viene generato un errore e non viene apportata alcuna modifica.
1 specifica che le modifiche all'articolo di merge comportano la reinizializzazione delle sottoscrizioni esistenti e consente la reinizializzazione.
[ @filter_type= ] filter_type
Specifica il tipo di filtro da aggiungere. filter_type è di tipo tinyint. I possibili valori sono i seguenti.Valore
Descrizione
1
Solo filtro join. Obbligatorio per il supporto dei Sottoscrittori SQL Server Compact 3.5 SP1.
2
Solo relazione tra record logici.
3
Filtro join e relazione tra record logici.
Per ulteriori informazioni, vedere Raggruppamento di modifiche alla righe correlate con record logici.
Valori restituiti
0 (esito positivo) o 1 (esito negativo)
Osservazioni
La stored procedure sp_addmergefilter viene utilizzata per la replica di tipo merge.
sp_addmergefilter può essere utilizzato solo con articoli di tabelle. Gli articoli di vista e di vista indicizzata non sono supportati.
Questa procedura può inoltre essere utilizzata per aggiungere una relazione logica tra due articoli che possono essere uniti o meno tramite un filtro join. filter_type viene utilizzato per specificare se il filtro di merge che si sta per aggiungere è un filtro join, una relazione logica oppure entrambi.
Per utilizzare record logici, la pubblicazione e gli articoli devono soddisfare una serie di requisiti. Per ulteriori informazioni, vedere Raggruppamento di modifiche alla righe correlate con record logici.
Questa opzione viene generalmente utilizzata per gli articoli che includono un riferimento di chiave esterna a una chiave primaria su una tabella pubblicata e tale tabella include un filtro definito nell'articolo corrispondente. Il subset di righe della chiave primaria viene utilizzato per determinare le righe di chiave esterna da replicare nel Sottoscrittore.
Non è possibile aggiungere un filtro join tra due articoli pubblicati se le tabelle di origine per entrambi gli articoli condividono lo stesso nome di oggetto tabella. In questo caso, anche se entrambe le tabelle appartengono a schemi diversi e sono caratterizzate da nomi di articolo univoci, la creazione del filtro join avrà esito negativo.
In caso di utilizzo di un filtro di riga con parametri e un filtro join in un articolo di tabella, la replica determina se una riga appartiene a una partizione del Sottoscrittore mediante la valutazione della funzione di filtro o il filtro join tramite l'operatore OR anziché la valutazione dell'intersezione delle due condizioni tramite l'operatore AND.
Esempio
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
Autorizzazioni
Solo i membri del ruolo predefinito del server sysadmin o del ruolo predefinito del database db_owner possono eseguire sp_addmergefilter.
Vedere anche