Definizione e modifica di un filtro di riga staticoDefine and Modify a Static Row Filter

In questo argomento viene descritto come definire e modificare un filtro di riga statico 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 static row filter in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

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 statico 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 static 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.

  • Se la pubblicazione è abilitata per la replica transazionale peer-to-peer, non sarà possibile filtrare le tabelle.If the publication is enabled for peer-to-peer transactional replication, tables cannot be filtered.

Indicazioni Recommendations

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Per definire, modificare ed eliminare filtri di riga statici, usare la pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o la pagina Filtra righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione>.Define, modify, and delete static 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 staticoTo define a static row filter

  1. L'operazione eseguita nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtra righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione> dipende dal tipo di pubblicazione:On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box, the action you take depends on the type of publication:

    • Per una pubblicazione snapshot o transazionale, fare clic su Aggiungi.For a snapshot or transactional publication, click Add.

    • Per una pubblicazione di tipo merge, fare clic su Aggiungie quindi su Aggiungi filtro.For a merge 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 per il filtro nell'area di testo Istruzione per il filtro .Create a filter statement in the Filter statement text area. È 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.

    Nota

    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. Se la pubblicazione proviene da un server di pubblicazione Oracle, è necessario che la clausola WHERE sia conforme alla sintassi Oracle.If the publication is from an Oracle Publisher, the WHERE clause must be compliant with Oracle syntax.

    • 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 [schema].[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. La clausola di filtro completa sarà simile alla seguente:The complete filter clause would appear like:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE [LoginID] = 'adventure-works\ranjit0'  
      
    • In un filtro di riga statico può essere inclusa una funzione definita dall'utente.A static row filter can include a user-defined function. La clausola di filtro completa per un filtro di riga statico con una funzione definita dall'utente sarà simile alla seguente:The complete filter clause for a static row filter with a user-defined function would appear like:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] WHERE MyFunction([Freight]) > 100  
      
  4. Fare clic su OK.Click OK.

  5. 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 staticoTo modify a static row filter

  1. Nella pagina Filtro righe tabelle della Creazione guidata nuova pubblicazione o nella pagina Filtra righe della finestra di dialogo 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> dialog box, 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 staticoTo delete a static row filter

  1. Nella pagina Filtro righe tabelle della Creazione guidata nuova pubblicazione o nella pagina Filtra righe della finestra di dialogo 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> dialog box, select a filter in the Filtered Tables pane, and then click Delete.

Utilizzo di Transact-SQL Using Transact-SQL

Quando si creano articoli di tabella, è possibile definire una clausola WHERE per escludere le righe di un articolo.When creating table articles, you can define a WHERE clause to filter rows out of an article. È inoltre possibile modificare un filtro di riga dopo che è stato definito.You can also change a row filter after it has been defined. È possibile creare e modificare a livello di programmazione i filtri di riga statici tramite le stored procedure di replica.Static row filters can be created and modified programmatically using replication stored procedures.

Per definire un filtro di riga statico per una pubblicazione snapshot o transazionaleTo define a static row filter for a snapshot or transactional publication

  1. Definire l'articolo da filtrare.Define the article to filter. Per altre informazioni, vedere definire un articolo.For more information, see Define an Article.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_articlefilter (Transact-SQL).At the Publisher on the publication database, execute sp_articlefilter (Transact-SQL). Specificare il nome dell'articolo per @article, il nome della pubblicazione per @publication, il nome del filtro per @filter_namee la clausola di filtro per @filter_clause (senza includere WHERE).Specify the name of the article for @article, the name of the publication for @publication, a name for the filter for @filter_name, and the filtering clause for @filter_clause (not including WHERE).

  3. Se non è ancora stato definito un filtro di colonna, vedere Definizione e modifica di un filtro colonne.If a column filter must still be defined, see Define and Modify a Column Filter. In caso contrario, eseguire sp_articleview (Transact-SQL).Otherwise, execute sp_articleview (Transact-SQL). Specificare il nome della pubblicazione per @publication, il nome dell'articolo filtrato per @articlee la clausola di filtro specificata nel passaggio 2 per @filter_clause.Specify the publication name for @publication, the name of the filtered article for @article, and the filter clause specified in step 2 for @filter_clause. Verranno creati gli oggetti di sincronizzazione per l'articolo filtrato.This creates the synchronization objects for the filtered article.

Per modificare un filtro di riga statico per una pubblicazione snapshot o transazionaleTo modify a static row filter for a snapshot or transactional publication

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_articlefilter (Transact-SQL).At the Publisher on the publication database, execute sp_articlefilter (Transact-SQL). Specificare il nome dell'articolo per @article, il nome della pubblicazione per @publication, il nome del nuovo filtro per @filter_namee la nuova clausola di filtro per @filter_clause (senza includere WHERE).Specify the name of the article for @article, the name of the publication for @publication, a name for the new filter for @filter_name, and the new filtering clause for @filter_clause (not including WHERE). Poiché questa modifica invaliderà i dati nelle sottoscrizioni esistenti, specificare il valore 1 per @force_reinit_subscription.Because this change will invalidate data in existing subscriptions, specify a value of 1 for @force_reinit_subscription.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_articleview (Transact-SQL).At the Publisher on the publication database, execute sp_articleview (Transact-SQL). Specificare il nome della pubblicazione per @publication, il nome dell'articolo filtrato per @articlee la clausola di filtro specificata nel passaggio 1 per @filter_clause.Specify the publication name for @publication, the name of the filtered article for @article, and the filter clause specified in step 1 for @filter_clause. Verrà ricreata la vista che definisce l'articolo filtrato.This re-creates the view that defines the filtered article.

  3. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.Rerun the Snapshot Agent job for the publication to generate an updated snapshot. Per altre informazioni, vedere Creazione e applicazione dello snapshot iniziale.For more information, see Create and Apply the Initial Snapshot.

  4. Reinizializzazione delle sottoscrizioni.Reinitialize subscriptions. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.For more information, see Reinitialize Subscriptions.

Per eliminare un filtro di riga statico per una pubblicazione snapshot o transazionaleTo delete a static row filter for a snapshot or transactional publication

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_articlefilter (Transact-SQL).At the Publisher on the publication database, execute sp_articlefilter (Transact-SQL). Specificare il nome dell'articolo per @article, il nome della pubblicazione per @publication, il valore NULL per @filter_namee il valore NULL per @filter_clause.Specify the name of the article for @article, the name of the publication for @publication, a value of NULL for @filter_name, and a value of NULL for @filter_clause. Poiché questa modifica invaliderà i dati nelle sottoscrizioni esistenti, specificare il valore 1 per @force_reinit_subscription.Because this change will invalidate data in existing subscriptions, specify a value of 1 for @force_reinit_subscription.

  2. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.Rerun the Snapshot Agent job for the publication to generate an updated snapshot. Per altre informazioni, vedere Creazione e applicazione dello snapshot iniziale.For more information, see Create and Apply the Initial Snapshot.

  3. Reinizializzazione delle sottoscrizioni.Reinitialize subscriptions. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.For more information, see Reinitialize Subscriptions.

Per definire un filtro di riga statico per una pubblicazione di tipo mergeTo define a static row filter for 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 la clausola di filtro per @subset_filterclause (senza includere WHERE).Specify the filtering clause for @subset_filterclause (not including WHERE). Per altre informazioni, vedere definire un articolo.For more information, see Define an Article.

  2. Se non è ancora stato definito un filtro di colonna, vedere Definizione e modifica di un filtro colonne.If a column filter must still be defined, see Define and Modify a Column Filter.

Per modificare un filtro di riga statico per una pubblicazione di tipo mergeTo modify a static row filter for a merge publication

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle (Transact-SQL).At the Publisher on the publication database, execute sp_changemergearticle (Transact-SQL). Specificare il nome della pubblicazione per @publication, il nome dell'articolo filtrato per @article, il valore subset_filterclause per @propertye la nuova clausola di filtro per @value (senza includere WHERE).Specify the publication name for @publication, the name of the filtered article for @article, a value of subset_filterclause for @property, and the new filtering clause for @value (not including WHERE). Poiché questa modifica invaliderà i dati nelle sottoscrizioni esistenti, specificare il valore 1 per @force_reinit_subscription.Because this change will invalidate data in existing subscriptions, specify a value of 1 for @force_reinit_subscription.

  2. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.Rerun the Snapshot Agent job for the publication to generate an updated snapshot. Per altre informazioni, vedere Creazione e applicazione dello snapshot iniziale.For more information, see Create and Apply the Initial Snapshot.

  3. Reinizializzazione delle sottoscrizioni.Reinitialize subscriptions. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.For more information, see Reinitialize Subscriptions.

Esempi (Transact-SQL) Examples (Transact-SQL)

In questo esempio di replica transazionale l'articolo viene filtrato orizzontalmente per rimuovere tutti i prodotti non più supportati.In this transactional replication example, the article is filtered horizontally to remove all discontinued products.

DECLARE @publication    AS sysname;
DECLARE @table AS sysname;
DECLARE @filterclause AS nvarchar(500);
DECLARE @filtername AS nvarchar(386);
DECLARE @schemaowner AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @table = N'Product';
SET @filterclause = N'[DiscontinuedDate] IS NULL'; 
SET @filtername = N'filter_out_discontinued';
SET @schemaowner = N'Production';

-- Add a horizontally and vertically filtered article for the Product table.
-- Manually set @schema_option to ensure that the Production schema 
-- is generated at the Subscriber (0x8000000).
EXEC sp_addarticle 
	@publication = @publication, 
	@article = @table, 
	@source_object = @table,
	@source_owner = @schemaowner, 
	@schema_option = 0x80030F3,
	@vertical_partition = N'true', 
	@type = N'logbased',
	@filter_clause = @filterclause;

-- (Optional) Manually call the stored procedure to create the 
-- horizontal filtering stored procedure. Since the type is 
-- 'logbased', this stored procedures is executed automatically.
EXEC sp_articlefilter 
	@publication = @publication, 
	@article = @table, 
	@filter_clause = @filterclause, 
	@filter_name = @filtername;

-- Add all columns to the article.
EXEC sp_articlecolumn 
	@publication = @publication, 
	@article = @table;

-- Remove the DaysToManufacture column from the article
EXEC sp_articlecolumn 
	@publication = @publication, 
	@article = @table, 
	@column = N'DaysToManufacture', 
	@operation = N'drop';

-- (Optional) Manually call the stored procedure to create the 
-- vertical filtering view. Since the type is 'logbased', 
-- this stored procedures is executed automatically.
EXEC sp_articleview 
	@publication = @publication, 
	@article = @table,
	@filter_clause = @filterclause;
GO

In questo esempio di replica di tipo merge gli articoli vengono filtrati orizzontalmente per restituire solo le righe che appartengono al venditore specificato.In this merge replication example, the articles are filtered horizontally to return only rows that belong to the specified salesperson. Viene utilizzato anche un filtro join.A join filter is also used. Per altre informazioni, vedere Definizione e modifica di un filtro di join tra articoli di merge.For more information, see Define and Modify a Join Filter Between Merge Articles.

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.BusinessEntityID = 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

Vedere ancheSee Also

Definizione e modifica di un filtro di riga con parametri per un articolo di merge Define and Modify a Parameterized Row Filter for a Merge Article
Modificare le proprietà di pubblicazioni e articoli Change Publication and Article Properties
Filtrare i dati pubblicati Filter Published Data
Filtrare i dati pubblicati per la replica di tipo merge Filter Published Data for Merge Replication