sp_addmergefilter (Transact-SQL)

Si applica a:SQL Server Istanza gestita di SQL di Azure

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.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Argomenti

[ @publication = ] N'publication'

Nome della pubblicazione in cui viene aggiunto il filtro di merge. @publication è sysname, senza impostazione predefinita.

[ @article = ] N'article'

Nome dell'articolo in cui viene aggiunto il filtro di unione. @article è sysname, senza impostazione predefinita.

[ @filtername = ] N'filtername'

Nome del filtro. @filtername è un parametro obbligatorio. @filtername è sysname, senza impostazione predefinita.

[ @join_articlename = ] N'join_articlename'

L'articolo padre a cui l'articolo figlio, specificato da @article, deve essere unito utilizzando la clausola join specificata da @join_filterclause, per determinare le righe nell'articolo figlio che soddisfano il criterio di filtro del filtro di merge. @join_articlename è sysname, senza impostazione predefinita. L'articolo deve trovarsi nella pubblicazione specificata da @publication.

[ @join_filterclause = ] N'join_filterclause'

Clausola join che deve essere utilizzata per unire l'articolo figlio specificato da @articlee dall'articolo padre specificato da @join_article, per determinare le righe qualificate per il filtro di merge. @join_filterclause è nvarchar(1000), senza impostazione predefinita.

[ @join_unique_key = ] join_unique_key

Specifica se il join tra l'articolo figlio @article e l'articolo padre @join_article è uno-a-molti, uno-a-uno, molti-a-uno o molti-a-molti. @join_unique_key è int, con un valore predefinito .0

  • 0 indica un join molti-a-uno o molti-a-molti.

  • 1 indica un join uno-a-uno o uno-a-molti.

Questo valore si verifica 1 quando le colonne di join formano una chiave univoca in @join_article o se @join_filterclause è tra una chiave esterna in @article e una chiave primaria in @join_article.

Attenzione

Impostare questo parametro 1 solo su se è presente un vincolo per la colonna di join nella tabella sottostante per l'articolo padre che garantisce l'univocità. Se @join_unique_key è impostata 1 su in modo non corretto, potrebbe verificarsi la mancata 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 è bit, con il valore predefinito 0.

  • 0 specifica che le modifiche apportate all'articolo di merge non causano l'invalidità dello 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 causare l'invalidità dello snapshot e, se sono presenti sottoscrizioni esistenti che richiedono un nuovo snapshot, concede l'autorizzazione per contrassegnare lo snapshot esistente come obsoleto e un nuovo snapshot generato.

[ @force_reinit_subscription = ] force_reinit_subscription

Segnala che l'azione eseguita dalla stored procedure potrebbe richiedere la reinizializzazione delle sottoscrizioni esistenti. @force_reinit_subscription è bit, con un valore predefinito .0

  • 0 specifica che le modifiche apportate all'articolo di merge non causano 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 apportate all'articolo di merge causano la reinizializzazione delle sottoscrizioni esistenti e concede l'autorizzazione per la reinizializzazione della sottoscrizione.

[ @filter_type = ] filter_type

Specifica il tipo di filtro da aggiungere. @filter_type è tinyint e può essere uno dei valori seguenti.

Valore Descrizione
1 Solo filtro di join. Obbligatorio per supportare i Sottoscrittori di SQL Server Compact.
2 Solo relazione tra record logici.
3 Filtro di join e relazione tra record logici.

Per altre informazioni, vedere Raggruppare modifiche alle righe correlate con record logici.

Valori del codice restituito

0 (esito positivo) o 1 (errore).

Osservazioni:

sp_addmergefilter viene usato nella replica di tipo merge.

sp_addmergefilter può essere utilizzato solo con gli articoli della tabella. Gli articoli di visualizzazione e vista indicizzata non sono supportati.

Questa procedura può essere usata anche per aggiungere una relazione logica tra due articoli che potrebbero avere o meno un filtro di join tra di essi. @filter_type viene usato per specificare se il filtro di unione da aggiungere è un filtro join, una relazione logica o entrambi.

Per utilizzare record logici, la pubblicazione e gli articoli devono soddisfare diversi requisiti. Per altre informazioni, vedere Raggruppare modifiche alle righe correlate con record logici.

In genere, questa opzione viene usata per un articolo che fa riferimento a una chiave esterna a una tabella chiave primaria pubblicata e la tabella della chiave primaria ha un filtro definito nel relativo articolo. 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 quando le tabelle di origine per entrambi gli articoli condividono lo stesso nome dell'oggetto tabella. In questo caso, anche se entrambe le tabelle sono di proprietà di schemi diversi e hanno nomi di articolo univoci, la creazione del filtro join ha esito negativo.

In caso di utilizzo di un filtro di riga con parametri e un filtro di join in un articolo di tabella, la replica determina se una riga appartiene a una partizione del Sottoscrittore A tale scopo, valutare la funzione di filtro o il filtro join (usando l'operatore OR ), anziché valutare l'intersezione delle due condizioni (usando l'operatore AND ).

Esempi

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 db_owner ruolo predefinito del database possono eseguire sp_addmergefilter.