Definire e modificare un filtro di riga statico

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Questo argomento descrive come definire e modificare un filtro di riga statico in SQL Server usando SQL Server Management Studio o Transact-SQL.

Contenuto dell'articolo

Prima di iniziare

Limitazioni e restrizioni

  • 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. Per altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.

  • Se la pubblicazione è abilitata per la replica transazionale peer-to-peer, non sarà possibile filtrare le tabelle.

Consigli

Utilizzo di 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>. 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.

Per definire un filtro di riga statico

  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:

    • Per una pubblicazione snapshot o transazionale, fare clic su Aggiungi.

    • Per una pubblicazione di tipo merge, fare clic su Aggiungie quindi su Aggiungi filtro.

  2. Nella finestra di dialogo Aggiungi filtro selezionare una tabella da filtrare nell'elenco a discesa.

  3. Creare un'istruzione per il filtro nell'area di testo Istruzione per il filtro . È possibile digitare direttamente nell'area di testo nonché trascinare colonne dalla casella di riepilogo Colonne .

    Nota

    Per la clausola WHERE è consigliabile usare nomi in due parti. I nomi in tre e quattro parti non sono supportati. Se la pubblicazione proviene da un server di pubblicazione Oracle, è necessario che la clausola WHERE sia conforme alla sintassi Oracle.

    • L'area di testo Istruzione per il filtro contiene il testo predefinito, nel formato seguente:

      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. La clausola di filtro completa sarà simile alla seguente:

      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. La clausola di filtro completa per un filtro di riga statico con una funzione definita dall'utente sarà simile alla seguente:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] WHERE MyFunction([Freight]) > 100  
      
  4. Seleziona OK.

  5. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.

Per modificare un filtro di riga statico

  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.

  2. Nella finestra di dialogo Modifica filtro modificare il filtro.

  3. Seleziona OK.

Per eliminare un filtro di riga statico

  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.

Utilizzo di Transact-SQL

Quando si creano articoli di tabella, è possibile definire una clausola WHERE per escludere le righe di un articolo. È inoltre possibile modificare un filtro di riga dopo che è stato definito. È possibile creare e modificare a livello di programmazione i filtri di riga statici tramite le stored procedure di replica.

Per definire un filtro di riga statico per una pubblicazione snapshot o transazionale

  1. Definire l'articolo da filtrare. Per altre informazioni, vedere definire un articolo.

  2. Nel database di pubblicazione del server di pubblicazione eseguire 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).

  3. Se non è ancora stato definito un filtro di colonna, vedere Definizione e modifica di un filtro colonne. In caso contrario, eseguire 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. Verranno creati gli oggetti di sincronizzazione per l'articolo filtrato.

Per modificare un filtro di riga statico per una pubblicazione snapshot o transazionale

  1. Nel database di pubblicazione del server di pubblicazione eseguire 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). Poiché questa modifica invaliderà i dati nelle sottoscrizioni esistenti, specificare il valore 1 per @force_reinit_subscription.

  2. Nel database di pubblicazione del server di pubblicazione eseguire 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. Verrà ricreata la vista che definisce l'articolo filtrato.

  3. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato. Per altre informazioni, vedere Creazione e applicazione dello snapshot iniziale.

  4. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

Per eliminare un filtro di riga statico per una pubblicazione snapshot o transazionale

  1. Nel database di pubblicazione del server di pubblicazione eseguire 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. Poiché questa modifica invaliderà i dati nelle sottoscrizioni esistenti, specificare il valore 1 per @force_reinit_subscription.

  2. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato. Per altre informazioni, vedere Creazione e applicazione dello snapshot iniziale.

  3. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

Per definire un filtro di riga statico per una pubblicazione di tipo merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL). Specificare la clausola di filtro per @subset_filterclause (senza includere WHERE). Per altre informazioni, vedere definire un articolo.

  2. Se non è ancora stato definito un filtro di colonna, vedere Definizione e modifica di un filtro colonne.

Per modificare un filtro di riga statico per una pubblicazione di tipo merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire 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). Poiché questa modifica invaliderà i dati nelle sottoscrizioni esistenti, specificare il valore 1 per @force_reinit_subscription.

  2. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato. Per altre informazioni, vedere Creazione e applicazione dello snapshot iniziale.

  3. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

Esempi (Transact-SQL)

In questo esempio di replica transazionale l'articolo viene filtrato orizzontalmente per rimuovere tutti i prodotti non più supportati.

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. Viene utilizzato anche un filtro join. Per altre informazioni, vedere Definizione e modifica di un filtro di join tra articoli di merge.

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

Vedi anche

Definire e modificare un filtro di riga con parametri per un articolo di merge
Modificare le proprietà di pubblicazioni e articoli
Filtrare i dati pubblicati
Filtrare i dati pubblicati per la replica di tipo merge