Filtri con parametri - Filtri di riga con parametriParameterized Filters - Parameterized Row Filters

I filtri di riga con parametri consentono l'invio di partizioni di dati diverse a Sottoscrittori diversi senza che sia necessario creare più pubblicazioni. Nelle versioni precedenti di SQL ServerSQL Server, i filtri con parametri vengono definiti filtri dinamici.Parameterized row filters allow different partitions of data to be sent to different Subscribers without requiring multiple publications to be created (parameterized filters were referred to as dynamic filters in previous versions of SQL ServerSQL Server). Una partizione è un subset delle righe di una tabella. In base alle impostazioni scelte durante la creazione di un filtro di riga con parametri, ogni riga di una tabella pubblicata può appartenere a un'unica partizione, con la conseguente produzione di partizioni non sovrapposte, o a due o più partizioni, con la conseguente produzione di partizioni sovrapposte.A partition is a subset of the rows in a table; depending on the settings chosen when creating a parameterized row filter, each row in a published table can belong to one partition only (which produces nonoverlapping partitions) or to two or more partitions (which produces overlapping partitions).

È possibile condividere le partizioni non sovrapposte tra sottoscrizioni oppure limitarle in modo che solo una sottoscrizione riceva una determinata partizione.Nonoverlapping partitions can be shared among subscriptions or they can be restricted so that only one subscription receives a given partition. Le impostazioni che controllano il comportamento delle partizioni vengono descritte nella sezione "Utilizzo delle opzioni di filtro appropriate" di seguito in questo argomento.The settings that control partition behavior are described in "Using the Appropriate Filtering Options" later in this topic. L'utilizzo di tali impostazioni consente di personalizzare il filtro con parametri in base ai requisiti dell'applicazione e delle prestazioni.Using these settings you can tailor parameterized filtering according to application and performance requirements. In generale, le partizioni sovrapposte offrono maggiore flessibilità, mentre le partizioni non sovrapposte replicate in una singola sottoscrizione garantiscono prestazioni superiori.In general, overlapping partitions allow for greater flexibility, and nonoverlapping partitions replicated to a single subscription provide better performance.

I filtri con parametri vengono utilizzati in una tabella singola e vengono in genere uniti ai filtri join per estendere il filtro alle tabelle correlate.Parameterized filters are used on a single table and are typically combined with join filters to extend filtering to related tables. Per altre informazioni, vedere Join Filters.For more information, see Join Filters.

Per definire o modificare un filtro di riga con parametri, vedere Definizione e modifica di un filtro di riga con parametri per un articolo di merge.To define or modify a parameterized row filter, see Define and Modify a Parameterized Row Filter for a Merge Article.

Modalità di funzionamento dei filtri con parametriHow Parameterized Filters Work

Un filtro di riga con parametri utilizza una clausola WHERE per selezionare i dati appropriati da pubblicare.A parameterized row filter uses a WHERE clause to select the appropriate data to be published. Anziché specificare un valore letterale nella clausola, come avviene con il filtro di riga statico, si specificano una o entrambe le funzioni di sistema seguenti: SUSER_SNAME() e HOST_NAME().Rather than specifying a literal value in the clause (as you do with a static row filter), you specify one or both of the following system functions: SUSER_SNAME() and HOST_NAME(). È anche possibile utilizzare funzioni definite dall'utente, ma è necessario che le funzioni di sistema SUSER_SNAME() o HOST_NAME() siano incluse nel corpo della funzione oppure vengano valutate, ad esempio MyUDF(SUSER_SNAME().User-defined functions can also be used, but they must include SUSER_SNAME() or HOST_NAME() in the body of the function, or evaluate one of these system functions (such as MyUDF(SUSER_SNAME()). Se una funzione definita dall'utente include SUSER_SNAME() o HOST_NAME() nel corpo della funzione, non è possibile passare parametri alla funzione.If a user-defined function includes SUSER_SNAME() or HOST_NAME() in the body of the function, you cannot pass parameters to the function.

Le funzioni di sistema SUSER_SNAME() e HOST_NAME() non sono specifiche della replica di tipo merge, ma vengono utilizzate da questo tipo di replica per il filtro con parametri:The system functions SUSER_SNAME() and HOST_NAME() are not specific to merge replication, but they are used by merge replication for parameterized filtering:

  • SUSER_SNAME() restituisce informazioni di accesso per le connessioni stabilite a un'istanza di SQL ServerSQL Server.SUSER_SNAME() returns login information for connections made to an instance of SQL ServerSQL Server. Quando viene impiegata in un filtro con parametri, restituisce le informazioni di accesso utilizzate dall'agente di merge per connettersi al server di pubblicazione. Le informazioni di accesso vengono specificate quando si crea una sottoscrizione.When used in a parameterized filter, it returns the login used by the Merge Agent to connect to the Publisher (you specify a login when you create a subscription).

  • HOST_NAME() restituisce il nome del computer che sta effettuando la connessione a un'istanza di SQL ServerSQL Server.HOST_NAME() returns the name of the computer that is connecting to an instance of SQL ServerSQL Server. Quando viene impiegata in un filtro con parametri, per impostazione predefinita restituisce il nome del computer in cui è in esecuzione l'agente di merge.When used in a parameterized filter, by default it returns the name of the computer on which the Merge Agent is running. Per le sottoscrizioni pull è il nome del Sottoscrittore, mentre per le sottoscrizioni push è il nome del server di distribuzione.For pull subscriptions it is the name of the Subscriber; for push subscriptions it is the name of the Distributor.

    È inoltre possibile sostituire questa funzione con un valore diverso dal nome del Sottoscrittore o del server di distribuzione.It is also possible to override this function with a value other than the name of the Subscriber or Distributor. In genere il valore di questa funzione viene sostituito con valori più significativi, ad esempio il nome o l'ID del venditore.Typically applications override this function with more meaningful values, such as a salesperson name or salesperson ID. Per ulteriori informazioni, vedere la sezione relativa alla sostituzione del valore di HOST_NAME() in questo argomento.For more information, see the section "Overriding the HOST_NAME() Value" in this topic.

    Il valore restituito dalla funzione di sistema viene confrontato con una colonna specificata nella tabella in cui viene applicato il filtro e i dati appropriati vengono scaricati nel Sottoscrittore.The value returned by the system function is compared to a column you specify in the table you are filtering, and the appropriate data is downloaded to the Subscriber. Il confronto viene effettuato quando la sottoscrizione è inizializzata, in modo che solo i dati appropriati siano contenuti nello snapshot iniziale, e ogni volta che la sottoscrizione viene sincronizzata.This comparison is made when the subscription is initialized (so only the appropriate data is contained in the initial snapshot) and every time the subscription is synchronized. Per impostazione predefinita, se una modifica nel server di pubblicazione ha come conseguenza la rimozione di una riga da una partizione, la riga viene eliminata nel Sottoscrittore. Questo comportamento viene controllato tramite il parametro @allow_partition_realignment di sp_addmergepublication (Transact-SQL).By default, if a change at the Publisher results in a row being moved out of a partition, the row is deleted at the Subscriber (this behavior is controlled using the @allow_partition_realignment parameter of sp_addmergepublication (Transact-SQL)).

Nota

Quando i confronti vengono effettuati per i filtri con parametri, vengono sempre utilizzate le regole di confronto del database.When comparisons are made for parameterized filters, the database collation is always used. Se, ad esempio, nelle regole di confronto del database non viene fatta distinzione tra maiuscole e minuscole, mentre in quelle della colonna o della tabella sì, durante il confronto non viene fatta tale distinzione.For example, if the database collation is case insensitive, but the table or column collation is case sensitive, the comparison will be case insensitive.

Applicazione del filtro con SUSER_SNAME()Filtering with SUSER_SNAME()

Si consideri la tabella Employee Table nel database di esempio Adventure WorksAdventure Works .Consider the Employee Table in the Adventure WorksAdventure Works sample database. In questa tabella è inclusa la colonna LoginID, contenente l'account di accesso per ogni dipendente nel formatodominio\account accesso.This table includes the column LoginID, which contains the login for each employee in the form 'domain\login'. Per filtrare questa tabella in modo che i dipendenti ricevano solo i dati pertinenti, specificare una clausola di filtro:To filter this table so that employees receive only the data related to them, specify a filter clause of:

LoginID = SUSER_SNAME()  

Il valore per uno dei dipendenti è, ad esempio, "adventure-works\john5".For example, the value for one of the employees is 'adventure-works\john5'. Quando l'agente di merge si connette al server di pubblicazione, utilizza l'account di accesso specificato durante la creazione della sottoscrizione, in questo caso "adventure-works\john5".When the Merge Agent connects to the Publisher, it uses the login you specified when creating the subscription (in this case 'adventure-works\john5'). L'agente di merge confronta quindi il valore restituito da SUSER_SNAME() con i valori nella tabella e scarica solo la riga che contiene un valore di "adventure-works\john5" nella colonna LoginID .The Merge Agent then compares the value returned by SUSER_SNAME() to the values in the table and downloads only the row that contains a value of 'adventure-works\john5' in the LoginID column.

Applicazione del filtro con HOST_NAME()Filtering with HOST_NAME()

Si consideri la tabella HumanResources.Employee .Consider the HumanResources.Employee table. Si supponga che in questa tabella sia inclusa una colonna ComputerName con il nome del computer di ogni dipendente nel formatonome_tipo di computer.Suppose this table contained a column such as ComputerName with the name of each employee's computer in the form 'name_computertype'. Per filtrare questa tabella in modo che i dipendenti ricevano solo i dati pertinenti, specificare una clausola di filtro:To filter this table so that employees receive only the data related to them, specify a filter clause of:

ComputerName = HOST_NAME()  

Il valore per uno dei dipendenti potrebbe ad esempio essere "john5_laptop".For example, the value for one of the employees could be 'john5_laptop'. Quando l'agente di merge si connette al server di pubblicazione, confronta il valore restituito da HOST_NAME() con i valori nella tabella e scarica solo la riga che contiene un valore di "john5_laptop" nella colonna ComputerName .When the Merge Agent connects to the Publisher, it compares the value returned by HOST_NAME() to the values in the table and downloads only the row that contains a value of 'john5_laptop' in the ComputerName column.

Le funzioni possono inoltre essere combinate in un filtro.It is also possible to combine the functions in a filter. Per essere certi che un dipendente riceva i dati solo nel caso utilizzi il proprio account di accesso nel computer, ad esempio, la clausola di filtro sarà:For example, if you wanted to ensure that an employee received data only if they used their login on their computer, the filter clause could be:

LoginID = SUSER_SNAME() AND ComputerName = HOST_NAME()  

A meno che non si sostituisca il valore di HOST_NAME(), il filtro con HOST_NAME() viene in genere utilizzato solo con le sottoscrizioni pull.Unless you are overriding the HOST_NAME() value, filtering with HOST_NAME() is typically used only with pull subscriptions. Il valore restituito dalla funzione è il nome del computer in cui è in esecuzione l'agente di merge.The value returned by the function is the name of the computer on which the Merge Agent is running. Per quanto riguarda le sottoscrizioni pull, il valore è diverso per ogni sottoscrizione, mentre per quanto riguarda le sottoscrizioni push il valore è identico. Per le sottoscrizioni push tutti gli agenti di merge vengono eseguiti nel server di distribuzione.For pull subscriptions, the value is different for each subscription, but for push subscriptions, the value is the same (all Merge Agents run at the Distributor for push subscriptions).

Importante

Poiché è possibile sostituire il valore della funzione HOST_NAME(), per controllare l'accesso a partizioni di dati non è possibile utilizzare filtri che includano HOST_NAME().The value for the HOST_NAME() function can be overridden; therefore it is not possible to use filters that include HOST_NAME() to control access to partitions of data. Per controllare l'accesso a partizioni di dati, utilizzare SUSER_SNAME(), SUSER_SNAME() in combinazione con HOST_NAME() oppure filtri di riga statici.To control access to partitions of data, use SUSER_SNAME(), SUSER_SNAME() in combination with HOST_NAME(), or use static row filters.

Sostituzione del valore di HOST_NAME()Overriding the HOST_NAME() Value

Come già evidenziato, per impostazione predefinita HOST_NAME() restituisce il nome del computer che sta effettuando la connessione a un'istanza di SQL ServerSQL Server.As noted earlier, HOST_NAME() by default returns the name of the computer that is connecting to an instance of SQL ServerSQL Server. Quando vengono utilizzati filtri con parametri, è normale sostituire questo valore fornendo un valore durante la creazione di una sottoscrizione.When using parameterized filters, it is common to override this value by supplying a value when you create a subscription. La funzione HOST_NAME() restituisce quindi il valore specificato anziché il nome del computer.The HOST_NAME() function then returns the value you specify rather than the name of the computer.

Nota

Se si sostituisce il valore HOST_NAME(), tutte le chiamate alla funzione HOST_NAME() restituiranno il valore specificato dall'utente.If you override HOST_NAME(), all calls to the HOST_NAME() function will return the value you specify. Verificare che il funzionamento di altre applicazioni non dipenda dal fatto che HOST_NAME() restituisca il nome del computer.Ensure that other applications are not depending on HOST_NAME() returning the computer name.

Si consideri la tabella HumanResources.Employee .Consider the HumanResources.Employee table. In questa tabella è inclusa la colonna EmployeeID.This table includes the column EmployeeID. Per filtrare questa tabella in modo che ogni dipendente riceva solo i dati di pertinenza, specificare una clausola di filtro:To filter this table so that each employee receives only the data related to them, specify a filter clause of:

EmployeeID = CONVERT(int,HOST_NAME())

Alla dipendente Pamela Ansman-Wolfe, ad esempio, è stato associato l'ID 280.For example, employee Pamela Ansman-Wolfe has been assigned an employee ID of 280. Specificare il valore dell'ID del dipendente (280 nell'esempio) come valore di HOST_NAME() durante la creazione di una sottoscrizione per questo dipendente.Specify the value of the employee ID (280 in our example) for the HOST_NAME() value when creating a subscription for this employee. Quando l'agente di merge si connette al server di pubblicazione, confronta il valore restituito da HOST_NAME() con i valori nella tabella e scarica solo la riga che contiene un valore di 280 nella colonna EmployeeID .When the Merge Agent connects to the Publisher, it compares the value returned by HOST_NAME() to the values in the table and downloads only the row that contains a value of 280 in the EmployeeID column.

Importante

La funzione HOST_NAME() restituisce un valore nchar . Se la colonna nella clausola di filtro è di un tipo di dati numerico, come nell'esempio sopra riportato, è pertanto necessario utilizzare CONVERT.The HOST_NAME() function returns an nchar value, so you must use CONVERT if the column in the filter clause is of a numeric data type, as it is in the example above. Per motivi relativi alle prestazioni, è consigliabile non applicare funzioni ai nomi di colonna nelle clausole di filtro di riga con parametri, come CONVERT(nchar,EmployeeID) = HOST_NAME().For performance reasons, we recommended that you do not apply functions to column names in parameterized row filter clauses, such as CONVERT(nchar,EmployeeID) = HOST_NAME(). È consigliabile invece utilizzare l'approccio indicato nell'esempio: EmployeeID = CONVERT(int,HOST_NAME()).Instead, we recommend using the approach shown in the example: EmployeeID = CONVERT(int,HOST_NAME()). Questa clausola può essere utilizzata per il parametro @subset_filterclause di sp_addmergearticle, ma in genere non può essere adottata nella Creazione guidata nuova pubblicazione. La procedura guidata esegue la clausola di filtro per la relativa convalida, ma tale operazione ha esito negativo poiché il nome del computer non può essere convertito in un tipo di dati int, i filtri con parametri vengono definiti filtri dinamici.This clause can be used for the @subset_filterclause parameter of sp_addmergearticle, but it typically cannot be used in the New Publication Wizard (the wizard executes the filter clause to validate it, which fails because the computer name cannot be converted to an int). Se si utilizza la Creazione guidata nuova pubblicazione, è consigliabile specificare CONVERT(nchar,EmployeeID) = HOST_NAME() nella procedura guidata e quindi utilizzare sp_changemergearticle per modificare la clausola in EmployeeID = CONVERT(int,HOST_NAME()) prima della creazione di uno snapshot per la pubblicazione.If you use the New Publication Wizard, we recommend specifying CONVERT(nchar,EmployeeID) = HOST_NAME() in the wizard and then use sp_changemergearticle to change the clause to EmployeeID = CONVERT(int,HOST_NAME()) before creating a snapshot for the publication.

Per sostituire il valore di HOST_NAME()To override the HOST_NAME() value

Utilizzare uno dei metodi seguenti per sostituire il valore di HOST_NAME():Use one of the following methods to override the HOST_NAME() value:

Inizializzazione di una sottoscrizione di una pubblicazione con filtri con parametriInitializing a Subscription to a Publication with Parameterized Filters

Quando si utilizzano filtri di riga con parametri nelle pubblicazioni di tipo merge, ogni sottoscrizione con uno snapshot in due parti viene inizializzata dalla replica.When parameterized row filters are used in merge publications, replication initializes each subscription with a two-part snapshot. Per altre informazioni, vedere Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

Utilizzo delle opzioni di filtro appropriateUsing the Appropriate Filtering Options

Quando si utilizzano filtri con parametri, è possibile avere il controllo su due aree principali:There are two key areas over which you have control when using parameterized filters:

  • La modalità di elaborazione dei filtri da parte della replica di tipo merge, operazione che viene controllata da una delle due impostazioni di pubblicazione: use partition groups e keep partition changes.How the filters are processed by merge replication, which is controlled by one of two publication settings: use partition groups and keep partition changes.

  • La modalità di condivisione dei dati tra i Sottoscrittori, che deve essere riflessa dall'impostazione dell'articolo partition options.How the data is shared among Subscribers, which must be reflected by the article setting partition options.

    Per impostare le opzioni di filtro, vedere Optimize Parameterized Row Filters.To set filtering options, see Optimize Parameterized Row Filters.

Impostazione di "use partition groups" e "keep partition changes"Setting 'use partition groups' and 'keep partition changes'

Entrambe le opzioni use partition groups e keep partition changes consentono di migliorare le prestazioni di sincronizzazione delle pubblicazioni con gli articoli filtrati tramite l'archiviazione di metadati aggiuntivi nel database di pubblicazione.Both the use partition groups and keep partition changes options improve the synchronization performance for publications with filtered articles by storing additional metadata in the publication database. L'opzione use partition groups offre prestazioni superiori tramite l'utilizzo della funzionalità delle partizioni pre-calcolate.The use partition groups option provides greater performance improvement through the use of the precomputed partitions feature. Questa opzione viene impostata su true per impostazione predefinita, se gli articoli nella pubblicazione sono conformi a un set di requisiti.This option is set to true by default if the articles in your publication adhere to a set of requirements. Per altre informazioni su questi requisiti, vedere Ottimizzare le prestazioni dei filtri con parametri con le partizioni pre-calcolate.For more information about these requirements, see Optimize Parameterized Filter Performance with Precomputed Partitions. Se gli articoli non soddisfano i requisiti per l'utilizzo delle partizioni pre-calcolate, l'opzione keep partition changes verrà impostata su true.If your articles do not meet the requirements for using precomputed partitions, the keep partition changes option to is set to true.

Impostazione di "partition options"Setting 'partition options'

Durante la creazione di un articolo, si specifica un valore per la proprietà partition options in base al modo in cui i dati nella tabella filtrata verranno condivisi dai Sottoscrittori.You specify a value for the partition options property when creating an article, according to the way in which data in the filtered table will be shared by Subscribers. È possibile impostare la proprietà su uno di quattro valori utilizzando sp_addmergearticle, sp_changemergearticlee la finestra di dialogo Proprietà articolo .The property can be set to one of four values using sp_addmergearticle, sp_changemergearticle, and the Article Properties dialog box. La proprietà può essere impostata su uno dei due valori utilizzando la finestra di dialogo Aggiungi filtro o Modifica filtro , disponibile nella Creazione guidata nuova pubblicazione, e nella finestra di dialogo Proprietà pubblicazione .The property can be set to one of two values using the Add Filter or Edit Filter dialog boxes, which are available from the New Publication Wizard and the Publication Properties dialog box. Nella tabella seguente vengono descritti i valori disponibili.The following table summarizes the available values:

DescrizioneDescription Valore in Aggiungi filtro e Modifica filtroValue in Add Filter and Edit Filter Valore in Proprietà articoloValue in Article Properties Valore nelle stored procedureValue in stored procedures
I dati nelle partizioni sono sovrapposti e il Sottoscrittore può aggiornare le colonne a cui si fa riferimento in un filtro con parametri.Data in the partitions is overlapping, and the Subscriber can update columns referenced in a parameterized filter. Una riga di questa tabella verrà inviata a più sottoscrizioniA row from this table will go to multiple subscriptions SovrapposteOverlapping 00
I dati nelle partizioni sono sovrapposti e il Sottoscrittore non può aggiornare le colonne a cui si fa riferimento in un filtro con parametri.Data in the partitions is overlapping, and the Subscriber cannot update columns referenced in a parameterized filter. N/DN/A Sovrapposte, non ammesse modifiche dei dati fuori partizioneOverlapping, disallow out-of-partition data changes 11
I dati nelle partizioni non sono sovrapposti e vengono condivisi dalle sottoscrizioni.Data in the partitions is not overlapping, and the data is shared between subscriptions. Il Sottoscrittore non può aggiornare le colonne a cui si fa riferimento in un filtro con parametri.The Subscriber cannot update columns referenced in a parameterized filter. N/DN/A Non sovrapposte, condivise dalle sottoscrizioniNonoverlapping, shared between subscriptions 22
I dati nelle partizioni non sono sovrapposti ed esiste un'unica sottoscrizione per partizione.Data in the partitions is not overlapping, and there is a single subscription per partition. Il Sottoscrittore non può aggiornare le colonne a cui si fa riferimento in un filtro con parametri.The Subscriber cannot update columns referenced in a parameterized filter. Una riga di questa tabella verrà inviata a una sola sottoscrizioneA row from this table will go to only one subscription Non sovrapposte, sottoscrizione unicaNonoverlapping, single subscription 33

*Se l'opzione di filtro sottostante è impostata su 0, 1 o 2, nelle finestre di dialogo Aggiungi filtro e Modifica filtro verrà visualizzata l'opzione Una riga di questa tabella verrà inviata a più sottoscrizioni.*If the underlying filtering option is set to 0, or 1, or 2, the Add Filter and Edit Filter dialog boxes will display A row from this table will go to multiple subscriptions.

Se si specifica questa opzione, per ogni partizione dei dati dell'articolo può esistere una sola sottoscrizione.If you specify this option, there can only be a single subscription for each partition of data in that article. Se si crea una seconda sottoscrizione nella quale il criterio di filtro porta alla restituzione della stessa partizione della sottoscrizione esistente, quest'ultima viene eliminata.If a second subscription is created in which the filtering criterion of the new subscription resolves to the same partition as the existing subscription, the existing subscription is dropped.

Importante

È necessario che il valore di partition options venga impostato in base alla modalità con cui i dati vengono condivisi dai Sottoscrittori.The partition options value must be set according to how data is shared by Subscribers. Se, ad esempio, si specifica che una partizione non sia sovrapposta, con una sola sottoscrizione per partizione, ma successivamente i dati vengono aggiornati in un altro Sottoscrittore, è possibile che si verifichi un errore nell'agente di merge durante la sincronizzazione e che quindi i dati non siano convergenti.If, for example, you specify that a partition is nonoverlapping with a single subscription per partition, but data is then updated at another Subscriber, the Merge Agent can fail during synchronization and non-convergence can occur.

Selezione dell'opzione di partizione appropriataSelecting the Appropriate Partition Option

Le partizioni non sovrapposte vengono utilizzate insieme alle partizioni pre-calcolate per migliorare le prestazioni in situazioni in cui alcuni limiti funzionali sono accettabili.Nonoverlapping partitions work in conjunction with precomputed partitions to improve performance in situations where some functional limitations are acceptable. Le partizioni pre-calcolate consentono di velocizzare i download nei Sottoscrittori, ma rallentano le operazioni di caricamento.Precomputed partitions quicken downloads to Subscribers, but slow uploads. Le partizioni non sovrapposte riducono al minimo il costo di caricamento associato alle partizioni pre-calcolate.Nonoverlapping partitions minimize the upload cost associated with precomputed partitions. Il vantaggio a livello di prestazioni delle partizioni non sovrapposte è più evidente quando i filtri con parametri e i filtri join utilizzati sono più complessi.The performance benefit of nonoverlapping partitions is more noticeable when the parameterized filters and join filters used are more complex.

Quando si scelgono le opzioni di partizione da utilizzare in una pubblicazione, considerare gli scenari seguenti.Consider the following scenarios when deciding which partition options to use in a publication.

  • Adventure WorksAdventure Works dispone di una forza vendite mobile in cui ogni venditore è responsabile dei clienti appartenenti a un determinato codice postale. has a mobile sales force with each sales person responsible for customers in a given zip code. L'applicazione richiede l'aggiornamento del codice postale nel caso un cliente passi da un territorio di vendita a un altro, affinché il cliente venga assegnato a un altro venditore.The application requires that the zip code be updated if a customer moves from one sales territory to another, so that the customer is assigned to a different sales person. Il filtro con parametri è basato sul codice postale del cliente e l'aggiornamento determina la rimozione del codice postale dalla partizione di un venditore e il relativo inserimento nella partizione di un altro venditore.The parameterized filter is based on the customer's zip code, and the update removes the zip code from one sales person's partition and inserts it into another sales person's partition. A tale scopo, sono necessarie partizioni sovrapposte che consentano di aggiornare le colonne a cui si fa riferimento in un filtro con parametri.This requires overlapping partitions with the ability to update columns referenced in a parameterized filter. Questa opzione ottimizza la flessibilità, ma il funzionamento potrebbe non essere ottimale come quello delle partizioni non sovrapposte.This option maximizes flexibility but might not perform as well as nonoverlapping partitions.

  • Un'agenzia di collocamento dispone di dati che vengono inviati alle filiali di ogni regione dello stato.An employment agency has data that is supplied to regional offices in each county of the state. I dati non si sovrappongono e ogni riga della tabella nella sede centrale dell'agenzia è inclusa in un'unica partizione, ma tale partizione viene inviata a più uffici della stessa regione.The data does not overlap; each row in the table at the agency's headquarters is included in only one partition, but that partition is sent to multiple offices in the same county. L'opzione che prevede partizioni non sovrapposte con partizioni condivise dalle sottoscrizioni è appropriata, poiché garantisce prestazioni migliori rispetto alle partizioni sovrapposte soddisfacendo al tempo stesso i requisiti dell'applicazione.The nonoverlapping partition option with partitions shared between subscriptions is appropriate, providing a performance improvement over overlapping partitions while satisfying the application requirements.

  • Se si dispone di partizioni non sovrapposte e una sola sottoscrizione riceve e aggiorna i dati in una partizione, sarà possibile ottenere ulteriori vantaggi a livello di prestazioni.If you have nonoverlapping partitions and only one subscription receives and updates the data in a partition, further performance benefits can be realized. Questo scenario è tipico dei sistemi POS e delle applicazioni relative al personale esterno in cui i dati vengono raccolti principalmente nel Sottoscrittore e caricati nel server di pubblicazione.This scenario is common for point of sale systems, and field force applications in which data is primarily collected at the Subscriber and uploaded to the Publisher. Si consideri una tabella Package in un'applicazione di recapito: quando ogni pacco viene caricato su un furgone, lo stato del pacco viene modificato nella tabella Package e la modifica viene replicata nella sede centrale.Consider a Package table in a delivery application: as each package is loaded onto a truck, the status of the package is changed in the Package table, and the change is replicated back to headquarters. Gli autisti non aggiornerebbero lo stato dello stesso pacco su due furgoni diversi, quindi per la tabella Package è ideale ricorrere a una partizione non sovrapposta con una sola sottoscrizione per partizione.Drivers would not update the status of the same package on two different trucks, so the Package table is a good candidate for a nonoverlapping partition with a single subscription per partition.

Considerazioni sulle partizioni non sovrapposteConsiderations for Nonoverlapping Partitions

Quando si utilizzano le partizioni non sovrapposte, tenere presenti le considerazioni seguenti:Keep the following considerations in mind when using nonoverlapping partitions.

Considerazioni generaliGeneral Considerations
  • È necessario che nella pubblicazione vengano utilizzate partizioni pre-calcolate.The publication must use precomputed partitions.

  • È necessario che una riga appartenga a una sola partizione.A row must belong to only one partition.

  • Gli articoli non possono fare parte di un record logico.Articles cannot be part of a logical record.

  • I partner di sincronizzazione alternativi non sono supportati. Questa funzionalità è deprecata.Alternate synchronization partners are not supported (this feature is deprecated).

  • Il Sottoscrittore non può aggiornare le colonne a cui si fa riferimento in un filtro con parametri.The Subscriber cannot update columns referenced in a parameterized filter.

  • Se un'operazione di inserimento nel Sottoscrittore non appartiene alla partizione, non viene eliminata.If an insert at a Subscriber does not belong to the partition, it is not deleted. Tuttavia, non verrà replicata in altri Sottoscrittori.However, it will not be replicated to other Subscribers.

  • In alcuni casi con le partizioni sovrapposte, gli intervalli di valori Identity vengono modificati quando vengono inseriti dati tramite l'agente di merge.In some circumstances with overlapping partitions, identity ranges are adjusted when the Merge Agent inserts data. Con le partizioni non sovrapposte, gli intervalli possono essere modificati solo durante le operazioni di inserimento di un utente che dispone dell'autorizzazione necessaria per modificare gli intervalli di valori Identity nel database di sottoscrizione.With nonoverlapping partitions, ranges can only be adjusted during inserts by a user who has permission to adjust identity ranges in the subscription database. L'utente deve essere il proprietario della tabella oppure un membro del ruolo predefinito del server sysadmin o del ruolo predefinito del database db_owner o db_ddladmin .The user must either own the table, or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

Considerazioni aggiuntive sulle partizioni non sovrapposte con una sola sottoscrizione per partizioneAdditional Considerations for Nonoverlapping Partitions with a Single Subscription per Partition
Considerazione aggiuntive sui filtri joinAdditional Considerations for Join Filters
  • In una gerarchia di filtri join un articolo con una partizione sovrapposta non può trovarsi sopra un articolo con una partizione non sovrapposta.In a join filter hierarchy, an article with an overlapping partition cannot appear above an article with a nonoverlapping partition. In altre parole, un articolo padre deve utilizzare partizioni non sovrapposte se queste sono utilizzate dall'articolo figlio.In other words, a parent article must use nonoverlapping partitions if the child article does. Per informazioni sui filtri join, vedere Join Filters.For information about join filters, see Join Filters.

  • È necessario che in un filtro join in cui la partizione non sovrapposta è un elemento figlio, la proprietà join unique key sia impostata su 1.A join filter in which the nonoverlapping partition is a child must have the join unique key property set to 1. Per altre informazioni, vedere Join Filters.For more information, see Join Filters.

  • È necessario che l'articolo abbia un solo filtro con parametri o un solo filtro join.The article should only have one parameterized filter or join filter. L'articolo può avere un filtro con parametri ed essere l'elemento padre in un filtro join.Having a parameterized filter and being the parent in a join filter is allowed. Non può invece avere un filtro con parametri ed essere l'elemento figlio in un filtro join.Having a parameterized filter and being the child in a join filter is not allowed. Non può inoltre avere più di un filtro join.Having more than one join filter is also not allowed.

  • Se due tabelle nel server di pubblicazione hanno una relazione tra filtri join e la tabella figlio contiene righe che non hanno una riga corrispondente nella tabella padre, un'operazione di inserimento della riga padre mancante non avrà come conseguenza il download delle righe correlate nel Sottoscrittore. Le righe verrebbero invece scaricate con partizioni sovrapposte.If two tables at the Publisher have a join filter relationship and the child table has rows that have no corresponding row in the parent table, an insert of the missing parent row will not result in the related rows being downloaded to the Subscriber (the rows would be downloaded with overlapping partitions). Se ad esempio la tabella SalesOrderDetail contiene righe che non dispongono di alcuna riga corrispondente nella tabella SalesOrderHeader e si inserisce la riga mancante in SalesOrderHeader, tale riga viene scaricata nel Sottoscrittore, mentre non vengono scaricate le righe corrispondenti presenti in SalesOrderDetail .For example, if the SalesOrderDetail table has rows with no corresponding row in the SalesOrderHeader table, and you insert the missing row in SalesOrderHeader, the row is downloaded to the Subscriber, but the corresponding rows in SalesOrderDetail are not.

Vedere ancheSee Also

Procedure consigliate per i filtri di riga basati sul tempo Best Practices for Time-Based Row Filters
Filtrare i dati pubblicati Filter Published Data
Filtrare i dati pubblicati per la replica di tipo merge Filter Published Data for Merge Replication