Procedura: Definizione e modifica di un filtro di riga statico (programmazione Transact-SQL della replica)

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. Poiché questi filtri sono statici, tutti i sottoscrittori riceveranno lo stesso subset dei dati. Se è necessario filtrare dinamicamente le righe in un articolo di tabella appartenente a una tabella di tipo merge, in modo che ogni sottoscrittore riceva una partizione diversa dei dati, vedere Procedura: Definizione e modifica di un filtro di riga con parametri per un articolo di merge (programmazione Transact-SQL della replica). La replica di tipo merge consente inoltre di filtrare righe correlate in base a un filtro di riga esistente. Per ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro join tra articoli di merge (programmazione Transact-SQL della replica).

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

  1. Definire l'articolo da filtrare. Per ulteriori informazioni, vedere Procedura: Definizione di un articolo (programmazione Transact-SQL della replica).

  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_name e la clausola di filtro per @filter_clause (senza includere WHERE).

  3. Se non è ancora stato definito un filtro di colonna, vedere Procedura: Definizione e modifica di un filtro di colonna (programmazione Transact-SQL della replica). In caso contrario, eseguire sp_articleview (Transact-SQL). Specificare il nome della pubblicazione per @publication, il nome dell'articolo filtrato per @article e 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_name e 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 @article e 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 ulteriori informazioni, vedere Procedura: Creazione dello snapshot iniziale (programmazione Transact-SQL della replica).

  4. Reinizializzare le sottoscrizioni. Per ulteriori informazioni, vedere Procedura: Reinizializzazione di una sottoscrizione (programmazione Transact-SQL della replica).

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_name e 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 ulteriori informazioni, vedere Procedura: Creazione dello snapshot iniziale (programmazione Transact-SQL della replica).

  3. Reinizializzare le sottoscrizioni. Per ulteriori informazioni, vedere Procedura: Reinizializzazione di una sottoscrizione (programmazione Transact-SQL della replica).

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 ulteriori informazioni, vedere Procedura: Definizione di un articolo (programmazione Transact-SQL della replica).

  2. Se non è ancora stato definito un filtro di colonna, vedere Procedura: Definizione e modifica di un filtro di colonna (programmazione Transact-SQL della replica).

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 @property e 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 ulteriori informazioni, vedere Procedura: Creazione dello snapshot iniziale (programmazione Transact-SQL della replica).

  3. Reinizializzare le sottoscrizioni. Per ulteriori informazioni, vedere Procedura: Reinizializzazione di una sottoscrizione (programmazione Transact-SQL della replica).

Esempio

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 ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro join tra articoli di merge (programmazione Transact-SQL della replica).

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