Applicazione di filtri ai dati pubblicati

L'applicazione di filtri agli articoli di tabella consente di creare partizioni di dati da pubblicare. Tramite l'applicazione di filtri ai dati pubblicati è possibile:

  • Ridurre al minimo la quantità di dati inviati in rete.

  • Ridurre la quantità dello spazio di archiviazione necessario nel Sottoscrittore.

  • Personalizzare le pubblicazioni e le applicazioni in base ai requisiti dei singoli Sottoscrittori.

  • Evitare o limitare i conflitti se è in corso l'aggiornamento dei dati nei Sottoscrittori, in quanto è possibile inviare partizioni di dati differenti a Sottoscrittori differenti. In due Sottoscrittori pertanto non verranno mai aggiornati gli stessi valori di dati.

  • Evitare di trasmettere dati riservati. Per limitare l'accesso di un Sottoscrittore ai dati è possibile utilizzare filtri di riga e di colonna. Per la replica di tipo merge, è necessario tenere presente alcuni aspetti relativi alla protezione se si utilizza un filtro con parametri che include HOST_NAME(). Per ulteriori informazioni, vedere la sezione relativa all'applicazione di filtri con HOST_NAME() in Filtri di riga con parametri.

La replica include quattro tipi di filtro:

  • Filtri di riga statici, disponibili con tutti i tipi di replica.

    L'utilizzo di questo tipo di filtro consente di scegliere un subset di righe da pubblicare. Tutti i Sottoscrittori di una pubblicazione filtrata ricevono lo stesso subset di righe per la tabella filtrata. Per ulteriori informazioni, vedere la sezione "Filtri di riga statici" di questo argomento.

  • Filtri di colonna, disponibili con tutti i tipi di replica.

    L'utilizzo di questo tipo di filtro consente di scegliere un subset di colonne da pubblicare. Per ulteriori informazioni, vedere la sezione "Filtri di colonna" in questo argomento.

  • Filtri di riga con parametri, disponibili solo con la replica di tipo merge.

    L'utilizzo di questo tipo di filtro consente di scegliere un subset di righe da pubblicare. Diversamente dai filtri statici che inviano lo stesso subset di righe a ogni Sottoscrittore, i filtri di riga con parametri utilizzano un valore di dati fornito dal Sottoscrittore per inviare ai Sottoscrittori subset di righe differenti. Per ulteriori informazioni, vedere Filtri di riga con parametri.

  • Filtri join, disponibili solo con la replica di tipo merge.

    I filtri join consentono di estendere un filtro di riga da una tabella pubblicata a un'altra. Per ulteriori informazioni, vedere Filtri join.

Filtri di riga statici

Nella figura seguente viene illustrata una tabella pubblicata, filtrata in modo che solo le righe 2, 3 e 6 siano incluse nella pubblicazione.

Filtri di riga

Un filtro di riga statico utilizza una clausola WHERE per selezionare i dati appropriati da pubblicare. La parte finale di tale clausola viene specificata dall'utente. Si consideri la Tabella Product (AdventureWorks) nel database di esempio di Adventure Works, che contiene la colonna ProductLine. Per pubblicare solo le righe contenenti dati su prodotti correlati alle mountain bike, specificare ProductLine = 'M'.

Un filtro di riga statico restituisce un singolo set di dati per ogni pubblicazione. Nell'esempio precedente tutti i Sottoscrittori riceverebbero solo le righe contenenti dati su prodotti correlati alle mountain bike. Se un altro Sottoscrittore richiede solo le righe contenenti dati su prodotti correlati alle biciclette da strada:

  • Con la replica snapshot o transazionale, è possibile creare un'altra pubblicazione e includere la tabella in entrambe le pubblicazioni (nella clausola di filtro relativa all'articolo di tale pubblicazione, specificare ProductLine = 'R').

    [!NOTA]

    Nelle pubblicazioni transazionali i filtri di riga comportano un notevole aumento dell'overhead in quanto la clausola di filtro per l'articolo viene valutata per ogni riga del log di una tabella pubblicata per stabilire se deve essere replicata. È consigliabile evitare l'uso dei filtri di riga nelle pubblicazioni transazionali se ogni nodo di replica può supportare il carico completo dei dati e se il set di dati complessivo è relativamente ridotto.

  • Con la replica di tipo merge, utilizzare i filtri di riga con parametri anziché creare più pubblicazioni con filtri di riga statici. Per ulteriori informazioni, vedere Filtri di riga con parametri.

Per definire o modificare un filtro di riga statico

Filtri colonne

Nella figura seguente viene illustrata una pubblicazione in cui la colonna C viene esclusa tramite un filtro.

Filtri di colonna

È inoltre possibile utilizzare contemporaneamente il filtro di riga e di colonna, come illustrato di seguito.

Filtri di riga e colonna

Dopo aver creato una pubblicazione, è possibile utilizzare il filtro di colonna per eliminare una colonna da una pubblicazione esistente, mantenendola nella tabella del server di pubblicazione, nonché includere una colonna esistente nella pubblicazione. Per altre modifiche, ad esempio l'aggiunta di una nuova colonna a una tabella e quindi all'articolo pubblicato, utilizzare la replica di modifica dello schema. Per ulteriori informazioni, vedere le sezioni relative all'aggiunta e all'eliminazione di colonne nell'argomento Modifiche allo schema nei database di pubblicazione.

Non è possibile escludere tramite filtro determinati tipi di pubblicazioni nei tipi di colonna elencati nella tabella seguente.

Tipo di colonna

Tipo di pubblicazione e opzioni

Colonna chiave primaria

Nelle pubblicazioni transazionali tutte le tabelle devono contenere una colonna chiave primaria. Le chiavi primarie non sono necessarie per le tabelle delle pubblicazioni di tipo merge, ma se è presente una colonna chiave primaria, non sarà possibile filtrarla.

Colonna chiave esterna

Tutte le pubblicazioni create mediante la Creazione guidata nuova pubblicazione. È possibile filtrare le colonne chiave esterna mediante le stored procedure Transact-SQL. Per ulteriori informazioni, Procedura: Definizione e modifica di un filtro di colonna (programmazione Transact-SQL della replica).

Colonna rowguid

Pubblicazioni di tipo merge1

Colonna msrepl_tran_version

Pubblicazioni snapshot o transazionali che consentono sottoscrizioni aggiornabili

Colonne che non consentono valori NULL e non contengono valori predefiniti o il set di proprietà IDENTITY.

Pubblicazioni snapshot o transazionali che consentono sottoscrizioni aggiornabili

Colonne con indici o vincoli univoci

Pubblicazioni snapshot o transazionali che consentono sottoscrizioni aggiornabili

Tutte le colonne di una pubblicazione di tipo merge SQL Server 7.0

Nelle pubblicazioni di tipo merge SQL Server 7.0 non è possibile filtrare le colonne.

Timestamp

Pubblicazioni snapshot o transazionali SQL Server 7.0 che consentono sottoscrizioni aggiornabili

1 Se si pubblica una tabella in una pubblicazione di tipo merge e tale tabella contiene già una colonna del tipo di dati uniqueidentifier con il set di proprietà ROWGUIDCOL, è possibile utilizzare questa colonna con la replica anziché creare una colonna aggiuntiva denominata rowguid. In questo caso è necessario pubblicare la colonna esistente.

Per definire o modificare un filtro di colonna

Considerazioni sull'applicazione di filtri

Durante l'applicazioni di filtri ai dati tenere presente quanto segue:

  • È necessario includere nella pubblicazione tutte le colonne a cui viene fatto riferimento nei filtri di riga. In altre parole, non è possibile utilizzare un filtro di colonna per escludere una colonna utilizzata in un filtro di riga.

  • Se si aggiunge o si modifica un filtro in seguito all'inizializzazione delle sottoscrizioni, sarà necessario reinizializzarle.

  • Il numero massimo di byte consentiti per una colonna utilizzata in un filtro è pari a 1024 per un articolo di una pubblicazione di tipo merge e a 8000 per un articolo di una pubblicazione transazionale.

  • Nei filtri di riga o join non è possibile fare riferimento alle colonne con i tipi di dati seguenti:

    • varchar(max) and nvarchar(max)

    • varbinary(max)

    • text and ntext

    • image

    • XML

    • UDT

  • La replica transazionale consente di replicare una vista indicizzata come vista o come tabella. Se la vista viene replicata come tabella, non sarà possibile filtrare le colonne dalla tabella.