Filtro dei dati pubblicatiFilter Published Data

L'applicazione di filtri agli articoli di una tabella consente di creare partizioni di dati da pubblicare.Filtering table articles enables you to create partitions of data to be published. Tramite l'applicazione di filtri ai dati pubblicati è possibile:By filtering published data, you can:

  • Ridurre al minimo la quantità di dati inviati in rete.Minimize the amount of data sent over the network.

  • Ridurre la quantità di spazio di archiviazione necessaria nel Sottoscrittore.Reduce the amount of storage space required at the Subscriber.

  • Personalizzare le pubblicazioni e le applicazioni in base ai requisiti dei singoli Sottoscrittori.Customize publications and applications based on individual Subscriber requirements.

  • Evitare o limitare i conflitti in caso di aggiornamento dei dati da parte dei Sottoscrittori grazie alla possibilità di inviare partizioni di dati diverse a Sottoscrittori diversi. In due Sottoscrittori pertanto non verranno mai aggiornati gli stessi valori di dati.Avoid or reduce conflicts if Subscribers are updating data, because different data partitions can be sent to different Subscribers (no two Subscribers will be updating the same data values).

  • Evitare la trasmissione di dati riservati.Avoid transmitting sensitive data. È possibile utilizzare i filtri di riga e di colonna per limitare l'accesso ai dati da parte dei Sottoscrittori.Row filters and column filters can be used to restrict a Subscriber's access to data. Nella replica di tipo merge è necessario tenere in considerazione alcuni aspetti relativi alla sicurezza se si utilizza un filtro con parametri che include HOST_NAME().For merge replication, there are security considerations if you use a parameterized filter that includes HOST_NAME(). Per ulteriori informazioni, vedere la sezione relativa all'utilizzo dei filtri con HOST_NAME() in Parameterized Row Filters.For more information, see the section "Filtering with HOST_NAME()" in Parameterized Row Filters.

    La replica include quattro tipi di filtro:Replication offers four types of filters:

  • Filtri di riga statici, disponibili con tutti i tipi di replica.Static row filters, which are available with all types of replication.

    L'utilizzo di questo tipo di filtro consente di scegliere un subset di righe da pubblicare.Using static row filters, you can choose a subset of rows to be published. Tutti i Sottoscrittori di una pubblicazione filtrata ricevono lo stesso subset di righe per la tabella filtrata.All Subscribers to a filtered publication receive the same subset of rows for the filtered table. Per ulteriori informazioni, vedere la sezione "Filtri di riga statici" di questo argomento.For more information, see the section "Static Row Filters" in this topic.

  • Filtri di colonna, disponibili con tutti i tipi di replica.Column filters, which are available with all types of replication.

    L'utilizzo di questo tipo di filtro consente di scegliere un subset di colonne da pubblicare.Using column filters, you can choose a subset of columns to be published. Per ulteriori informazioni, vedere la sezione "Filtri di colonna" in questo argomento.For more information, see the section "Column Filters" in this topic.

  • Filtri di riga con parametri, disponibili solo con la replica di tipo merge.Parameterized row filters, which are available only with merge replication.

    L'utilizzo di questo tipo di filtro consente di scegliere un subset di righe da pubblicare.Using parameterized row filters, you can choose a subset of rows to be published. 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.Unlike static filters that send the same subset of rows to every Subscriber, parameterized row filters use a data value supplied by the Subscriber to send Subscribers different subsets of rows. Per altre informazioni, vedere Parameterized Row Filters.For more information, see Parameterized Row Filters.

  • Filtri join, disponibili solo con la replica di tipo merge.Join filters, which are available only with merge replication.

    I filtri join consentono di estendere un filtro di riga da una tabella pubblicata a un'altra.Using join filters, you can extend a row filter from one published table to another. Per altre informazioni, vedere Join Filters.For more information, see Join Filters.

filtri di riga staticiStatic Row Filters

Nella figura seguente viene illustrata una tabella pubblicata, filtrata in modo che solo le righe 2, 3 e 6 siano incluse nella pubblicazione.The following illustration shows a published table that is filtered so that only rows 2, 3, and 6 are included in the publication.

Filtri di rigaRow filtering

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.A static row filter uses a WHERE clause to select the appropriate data to be published; you specify the final part of the WHERE clause. Si consideri la tabella Product nel database di esempio AdventureWorks in cui è inclusa la colonna ProductLine.Consider the Product Table in the Adventure Works sample database, which contains the column ProductLine. Per pubblicare solo le righe contenenti dati su prodotti correlati alle mountain bike, specificare ProductLine = 'M'.To publish only the rows with data on products related to mountain bikes, specify ProductLine = 'M'.

Un filtro di riga statico restituisce un singolo set di dati per ogni pubblicazione.A static row filter results in a single set of data for each publication. Nell'esempio precedente tutti i Sottoscrittori riceverebbero solo le righe contenenti dati su prodotti correlati alle mountain bike.In the previous example, all Subscribers would receive only the rows with data on products related to mountain bikes. Se un altro Sottoscrittore richiede solo le righe contenenti dati su prodotti correlati alle biciclette da strada:If you have another Subscriber that requires only the rows with data on products related to road bikes:

  • 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').With snapshot or transactional replication, you can create another publication and include the table in both publications (in the filter clause for the article in that publication, specify 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.Row filters in transactional publications can add significant overhead because the article filter clause is evaluated for each log row written for a published table, to determine whether the row should be replicated. È 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.Row filters in transactional publications should be avoided if each replication node can support the full data load, and the overall data set is reasonably small.

  • Con la replica di tipo merge, utilizzare i filtri di riga con parametri anziché creare più pubblicazioni con filtri di riga statici.With merge replication, use parameterized row filters rather than creating multiple publications with static row filters. Per altre informazioni, vedere Parameterized Row Filters.For more information, see Parameterized Row Filters.

    Per definire o modificare un filtro di riga statico, vedere Define and Modify a Static Row Filter.To define or modify a static row filter, see Define and Modify a Static Row Filter.

Filtri colonneColumn Filters

Nella figura seguente viene illustrata una pubblicazione in cui la colonna C viene esclusa tramite un filtro.The following illustration shows a publication that filters out column C.

Filtri di colonnaColumn filtering

È inoltre possibile utilizzare contemporaneamente il filtro di riga e di colonna, come illustrato di seguito.You can also use row and column filtering together, as illustrated here.

Filtri di riga e colonnaRow and column filtering

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.After a publication is created, you can use column filtering to drop a column from an existing publication, but retain the column in the table at the Publisher, and also to include an existing column in the publication. 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.For other changes, such as adding a new column to a table and then adding it to the published article, use schema change replication. Per altre informazioni, vedere le sezioni "Aggiunta di colonne" ed "Eliminazione di colonne" nell'argomento Apportare modifiche allo schema nei database di pubblicazione.For more information, see the "Adding Columns" and "Dropping Columns" sections in the topic Make Schema Changes on Publication Databases.

Non è possibile escludere tramite filtro determinati tipi di pubblicazioni nei tipi di colonna elencati nella tabella seguente.The types of columns listed in the following table cannot be filtered out of certain types of publications.

Tipo di colonnaColumn type Tipo di pubblicazione e opzioniType of publication and options
Colonna chiave primariaPrimary key column Nelle pubblicazioni transazionali tutte le tabelle devono contenere una colonna chiave primaria.Primary key columns are required for all tables in transactional publications. 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.Primary keys are not required for tables in merge publications, but if a primary key column is present, it cannot be filtered.
Colonna chiave esternaForeign key column Tutte le pubblicazioni create mediante la Creazione guidata nuova pubblicazione.All publications created using the New Publication wizard. È possibile filtrare le colonne chiave esterna mediante le stored procedure Transact-SQL.You can filter foreign key columns using Transact-SQL stored procedures. Per ulteriori informazioni, vedere Define and Modify a Column Filter.For more information, Define and Modify a Column Filter.
Colonna rowguidThe rowguid column Pubblicazioni di tipo mergeMerge publications
Colonna msrepl_tran_versionThe msrepl_tran_version column Pubblicazioni snapshot o transazionali che consentono sottoscrizioni aggiornabiliSnapshot or transactional publications that allow updatable subscriptions
Colonne che non consentono valori NULL e non contengono valori predefiniti o il set di proprietà IDENTITY.Columns that do not allow NULL and do not have default values or the IDENTITY property set. Pubblicazioni snapshot o transazionali che consentono sottoscrizioni aggiornabiliSnapshot or transactional publications that allow updatable subscriptions
Colonne con indici o vincoli univociColumns with unique constraints or indexes Pubblicazioni snapshot o transazionali che consentono sottoscrizioni aggiornabiliSnapshot or transactional publications that allow updatable subscriptions
Tutte le colonne di una pubblicazione di tipo merge SQL Server 7.0All columns in a SQL Server 7.0 merge publication Nelle pubblicazioni di tipo merge SQL Server 7.0 non è possibile filtrare le colonne.Columns cannot be filtered in SQL Server 7.0 merge publications.
TimestampTimestamp Pubblicazioni snapshot o transazionali SQL Server 7.0 che consentono sottoscrizioni aggiornabiliSQL Server 7.0 snapshot or transactional publications that allow updatable subscriptions

*Se si pubblica una tabella in una pubblicazione di tipo merge e tale tabella contiene già una colonna con tipo di dati uniqueidentifier con la proprietà ROWGUIDCOL impostata, la replica può usare questa colonna invece di creare una colonna aggiuntiva denominata rowguid.*If you are publishing a table in a merge publication and that table already contains a column of data type uniqueidentifier with the ROWGUIDCOL property set, replication can use this column instead of creating an additional column named rowguid. In questo caso è necessario pubblicare la colonna esistente.In this case, the existing column must be published.

Per definire o modificare un filtro colonne, vedere Define and Modify a Column Filter.To define or modify a column filter, see Define and Modify a Column Filter.

Considerazioni sull'applicazione di filtriFiltering Considerations

Durante l'applicazioni di filtri ai dati tenere presente quanto segue:Keep the following considerations in mind when filtering data:

  • È necessario includere nella pubblicazione tutte le colonne a cui viene fatto riferimento nei filtri di riga.All columns referenced in row filters must be included in the publication. In altre parole, non è possibile utilizzare un filtro di colonna per escludere una colonna utilizzata in un filtro di riga.In other words, you cannot use a column filter to exclude a column that is used in a row filter.

  • Se si aggiunge o si modifica un filtro in seguito all'inizializzazione delle sottoscrizioni, sarà necessario reinizializzarle.If a filter is added or changed after subscriptions have been initialized, the subscriptions must be reinitialized.

  • 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.The maximum number of bytes allowed for a column used in a filter is 1024 for an article in a merge publication and 8000 for an article in a transactional publication.

  • Nei filtri di riga o join non è possibile fare riferimento alle colonne con i tipi di dati seguenti:Columns with the following data types cannot be referenced in row filters or join filters:

    • varchar(max) e nvarchar(max)varchar(max) and nvarchar(max)

    • varbinary(max)varbinary(max)

    • text e ntexttext and ntext

    • imageimage

    • XMLXML

    • UDTUDT

  • La replica transazionale consente di replicare una vista indicizzata come vista o come tabella.Transactional replication allows you to replicate an indexed view as a view or as a table. Se la vista viene replicata come tabella, non sarà possibile filtrare le colonne dalla tabella.If you replicate the view as a table, you cannot filter columns from the table.

    I filtri di riga non sono progettati per funzionare nei database.Row filters are not designed to work across databases. SQL ServerSQL Server viene limitata intenzionalmente l'esecuzione di sp_replcmds (in cui vengono eseguiti i filtri) al proprietario del database (dbo). intentionally restricts the execution of sp_replcmds (which filters execute under) to the database owner (dbo). Al dbo non sono associati privilegi tra database.The dbo does not have cross database privileges. Grazie all'aggiunta di CDC (Change Data Capture) in SQL Server 2008SQL Server 2008 the sp_replcmds le tabelle di rilevamento delle modifiche vengono popolate con le informazioni che possono essere restituite all'utente e su cui quest'ultimo può eseguire una query.With the addition of CDC (Change Data Capture) in SQL Server 2008SQL Server 2008 the sp_replcmds logic populates the change tracking tables with information that the user can return to and query. Per motivi di sicurezza, in SQL ServerSQL Server viene limitata l'esecuzione di questa logica in modo che un dbo malintenzionato non possa rubare il percorso di esecuzione.For security reasons, SQL ServerSQL Server restricts the execution of this logic so that a malicious dbo can’t highjack this execution path. Ad esempio, un dbo malintenzionato potrebbe aggiungere trigger nelle tabelle CDC che quindi verrebbero eseguite nel contesto della chiamata a sp_replcmdsda parte dell'utente, in questo caso l'agente di lettura log.For example, a malicious dbo could add triggers on CDC tables which would then get executed under the context of the user calling sp_replcmds, in this case the logreader agent. Se all'account con cui l'agente è in esecuzione sono associati privilegi superiori, il dbo malintenzionato potrebbe tentare l'escalation dei suoi privilegi.If the account the agent is running under has higher privilege the malicious dbo could escalate his privileges.

Vedere ancheSee Also

Pubblicare dati e oggetti di databasePublish Data and Database Objects