Definizione e modifica di un filtro di riga con parametri per un articolo di mergeDefine and Modify a Parameterized Row Filter for a Merge Article

In questo argomento viene descritto come definire e modificare un filtro di riga con parametri in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to define and modify a parameterized row filter in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

Quando si creano articoli di tabella, è possibile usare filtri di riga con parametri.When creating table articles, you can use parameterized row filters. Questi filtri usano una clausola WHERE per selezionare i dati adatti da pubblicare.These filters use 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. Per altre informazioni sui filtri di riga con parametri, vedere Filtri di riga con parametri.For more information, see Parameterized Row Filters.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Limitazioni e restrizioni Limitations and Restrictions

  • Se si aggiunge, modifica o elimina un filtro di riga con parametri dopo che sono state inizializzate sottoscrizioni per la pubblicazione, è necessario generare un nuovo snapshot e reinizializzare tutte le sottoscrizioni in seguito alla modifica.If you add, modify, or delete a parameterized row filter after subscriptions to the publication have been initialized, you must generate a new snapshot and reinitialize all subscriptions after making the change. Per altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.For more information about requirements for property changes, see Change Publication and Article Properties.

Indicazioni Recommendations

  • Per motivi relativi alle prestazioni è consigliabile evitare di applicare funzioni ai nomi di colonna nelle clausole per filtri di riga con parametri, come LEFT([MyColumn]) = SUSER_SNAME().For performance reasons, we recommend that you not apply functions to column names in parameterized row filter clauses, such as LEFT([MyColumn]) = SUSER_SNAME(). Se si usano HOST_NAME in una clausola di filtro e si sostituisce il valore HOST_NAME, può essere necessario convertire i tipi di dati tramite l'istruzione CONVERT.If you use HOST_NAME in a filter clause and override the HOST_NAME value, it might be necessary to convert data types using CONVERT. Per altre informazioni sulle procedure consigliate in questo caso, vedere la sezione relativa alla sostituzione del valore HOST_NAME() nell'argomento Parameterized Row Filters.For more information about best practices for this case, see the section "Overriding the HOST_NAME() Value" in the topic Parameterized Row Filters.

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Definire, modificare ed eliminare filtri di riga con parametri nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione oppure nella pagina Filtra righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione>.Define, modify, and delete parameterized row filters on the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box. Per altre informazioni sull'uso della creazione guidata e l'accesso alla finestra di dialogo, vedere Creare una pubblicazione e Visualizzare e modificare le proprietà della pubblicazione.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

Per definire un filtro di riga con parametriTo define a parameterized row filter

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione oppure nella pagina Filtra righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su Aggiungi e quindi su Aggiungi filtro.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, click Add, and then click Add Filter.

  2. Nella finestra di dialogo Aggiungi filtro selezionare una tabella da filtrare nell'elenco a discesa.In the Add Filter dialog box, select a table to filter from the drop-down list box.

  3. Creare un'istruzione di filtro nella casella di testo Istruzione per il filtro .Create a filter statement in the Filter statement text box. È possibile digitare direttamente nell'area di testo nonché trascinare colonne dalla casella di riepilogo Colonne .You can type directly in the text area, and you can also drag and drop columns from the Columns list box.

    • L'area di testo Istruzione per il filtro contiene il testo predefinito, nel formato seguente:The Filter statement text area includes the default text, which is in the form of:

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • Il testo predefinito non può essere modificato. Digitare la clausola di filtro dopo la parola chiave WHERE usando la sintassi SQL standard.The default text cannot be changed; type the filter clause after the WHERE keyword using standard SQL syntax. Un filtro con parametri include una chiamata alla funzione di sistema HOST_NAME() e/o SUSER_SNAME()oppure a una funzione definita dall'utente che fa riferimento a una di queste funzioni o a entrambe.A parameterized filter includes a call to the system function HOST_NAME() and/or SUSER_SNAME(), or a user-defined function that references one or both of these functions. Di seguito è riportato un esempio di una clausola di filtro completa per un filtro di riga con parametri:The following is an example of a complete filter clause for a parameterized row filter:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

      Per la clausola WHERE è consigliabile usare nomi in due parti. I nomi in tre e quattro parti non sono supportati.The WHERE clause should use two-part naming; three-part naming and four-part naming are not supported.

  4. Selezionare l'opzione corrispondente alla modalità desiderata di condivisione dei dati tra i Sottoscrittori:Select the option that matches how data will be shared among Subscribers:

    • Una riga di questa tabella verrà inviata a più sottoscrizioniA row from this table will go to multiple subscriptions

    • Una riga di questa tabella verrà inviata a una sola sottoscrizioneA row from this table will go to only one subscription

      Selezionando Una riga di questa tabella verrà inviata a una sola sottoscrizioneè possibile ottimizzare le prestazioni della replica di tipo merge archiviando ed elaborando una minore quantità di metadati.If you select A row from this table will go to only one subscription, merge replication can optimize performance by storing and processing less metadata. È tuttavia necessario garantire che i dati vengano partizionati in modo da non consentire la replica di una riga in più Sottoscrittori.However, you must ensure that the data is partitioned in such a way that a row cannot be replicated to more than one Subscriber. Per altre informazioni, vedere la sezione relativa all'impostazione delle opzioni delle partizioni nell'argomento Parameterized Row Filters.For more information, see the section "Setting 'partition options'" in the topic Parameterized Row Filters.

  5. Fare clic su OK.Click OK.

  6. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

Per modificare un filtro di riga con parametriTo modify a parameterized row filter

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Modifica.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Edit.

  2. Nella finestra di dialogo Modifica filtro modificare il filtro.In the Edit Filter dialog box, modify the filter.

  3. Fare clic su OK.Click OK.

Per eliminare un filtro di riga con parametriTo delete a parameterized row filter

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Elimina.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Delete.

Utilizzo di Transact-SQL Using Transact-SQL

È possibile creare e modificare a livello di programmazione i filtri di riga con parametri tramite le stored procedure di replica.Parameterized row filters can be created and modified programmatically using replication stored procedures.

Per definire un filtro di riga con parametri per un articolo in una pubblicazione di tipo mergeTo define a parameterized row filter for an article in a merge publication

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL).At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL). Specificare @publication, un nome di articolo per @article, la tabella da pubblicare per @source_object, la clausola WHERE che definisce il filtro con parametri per @subset_filterclause (escluso WHERE) e uno dei valori seguenti per @partition_options, che descrive il tipo di partizionamento risultante dall'applicazione del filtro di riga con parametri:Specify @publication, a name for the article for @article, the table being published for @source_object, the WHERE clause that defines the parameterized filter for @subset_filterclause (not including WHERE), and one of the following values for @partition_options, which describes the type of partitioning that will result from the parameterized row filter:

    • 0 : il filtro dell'articolo è statico oppure non restituisce un subset univoco di dati per ogni partizione, ovvero si tratta di una partizione "sovrapposta".0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" partition).

    • 1 : le partizioni risultanti sono sovrapposte e gli aggiornamenti apportati nel Sottoscrittore non possono modificare la partizione a cui appartiene una riga.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 2 : il filtro dell'articolo restituisce partizioni non sovrapposte, ma più Sottoscrittori ricevono la stessa partizione.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 : il filtro dell'articolo restituisce partizioni non sovrapposte univoche per ogni sottoscrizione.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

Per modificare un filtro di riga con parametri per un articolo in una pubblicazione di tipo mergeTo change a parameterized row filter for an article in a merge publication

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Specificare @publication, @article, il valore subset_filterclause per @property, l'espressione che definisce il filtro con parametri per @value (escluso WHERE) e il valore 1 sia per @force_invalidate_snapshot e @force_reinit_subscription.Specify @publication, @article, a value of subset_filterclause for @property, the expression that defines the parameterized filter for @value (not including WHERE), and a value of 1 for both @force_invalidate_snapshot and @force_reinit_subscription.

  2. Se questa modifica implica un diverso comportamento del partizionamento, eseguire nuovamente sp_changemergearticle .If this change results in different partitioning behavior, then execute sp_changemergearticle again. Specificare @publication, @article, il valore partition_options per @propertye l'opzione di partizionamento più appropriata tra quelle elencate di seguito per @value:Specify @publication, @article, a value of partition_options for @property, and the most appropriate partitioning option for @value, which can be one of the following:

    • 0 : il filtro dell'articolo è statico oppure non restituisce un subset univoco di dati per ogni partizione, ovvero si tratta di una partizione "sovrapposta".0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" partition).

    • 1 : le partizioni risultanti sono sovrapposte e gli aggiornamenti apportati nel Sottoscrittore non possono modificare la partizione a cui appartiene una riga.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 2 : il filtro dell'articolo restituisce partizioni non sovrapposte, ma più Sottoscrittori ricevono la stessa partizione.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 : il filtro dell'articolo restituisce partizioni non sovrapposte univoche per ogni sottoscrizione.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

Esempio (Transact-SQL) Example (Transact-SQL)

In questo esempio viene definito un gruppo di articoli di una pubblicazione di tipo merge in cui agli articoli è applicata una serie di filtri di join sulla tabella Employee che presenta essa stessa un filtro di riga con parametri sulla colonna LoginID .This example defines a group of articles in a merge publication where the articles are filtered with a series of join filters against the Employee table that is itself filtered using a parameterized row filter on the LoginID column. Durante la sincronizzazione viene sostituito il valore restituito dalla funzione HOST_NAME .During synchronization, the value returned by the HOST_NAME function is overridden. Per altre informazioni, vedere la sezione relativa alla sostituzione del valore HOST_NAME() nell'argomento Parameterized Row Filters.For more information, see Overriding the HOST_NAME() Value in the topic Parameterized Row Filters.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2012];

-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2012.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

Vedere ancheSee Also

Define and Modify a Join Filter Between Merge Articles Define and Modify a Join Filter Between Merge Articles
Modificare le proprietà di pubblicazioni e articoli Change Publication and Article Properties
Filtri di join Join Filters
Parameterized Row Filters Parameterized Row Filters