Condividi tramite


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

Durante la creazione di articoli di tabella è possibile definire le colonne da includere nell'articolo e modificare le colonne dopo aver definito l'articolo. È possibile creare e modificare a livello di programmazione le colonne filtrate tramite le stored procedure di replica. Alcuni tipi di colonna, ad esempio identity e rowguid, non possono essere rimosse da un articolo pubblicato. Per ulteriori informazioni, vedere la sezione relativa ai filtri di colonna nell'argomento Applicazione di filtri ai dati pubblicati.

[!NOTA]

Nelle procedure seguenti si presuppone che la tabella sottostante non sia modificata. Per informazioni sulla replica di modifiche DDL (Data Definition Language) in tabelle pubblicate, vedere Modifiche allo schema nei database di pubblicazione.

Per definire un filtro di colonna per un articolo pubblicato di 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_articlecolumn. Verranno definite le colonne da includere o rimuovere dall'articolo.

    • Se si intende pubblicare solo alcune colonne di una tabella contenente molte colonne, eseguire sp_articlecolumn una volta per ogni colonna da aggiungere. Specificare il nome della colonna per @column e il valore add per @operation.

    • Se si intende pubblicare la maggior parte delle colonna di una tabella contenente molte colonne, eseguire sp_articlecolumn, specificando il valore null per @column e il valore add per @operation per aggiungere tutte le colonne. Eseguire quindi sp_articlecolumn, una volta per ogni colonna da escludere, specificando il valore drop per @operation e il nome della colonna esclusa per @column.

  3. Nel database di pubblicazione del server di pubblicazione eseguire sp_articleview. Specificare il nome della pubblicazione per @publication e il nome dell'articolo filtrato per @article. Verranno creati gli oggetti di sincronizzazione per l'articolo filtrato.

Per modificare un filtro colonne in modo da includere colonne aggiuntive per un articolo pubblicato di una pubblicazione snapshot o transazionale

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_articlecolumn una volta per ogni colonna da aggiungere. Specificare il nome della colonna per @column e il valore add per @operation.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_articleview. Specificare il nome della pubblicazione per @publication e il nome dell'articolo filtrato per @article. Se per la pubblicazione esistono sottoscrizioni, specificare il valore 1 per @change_active. Verranno creati nuovamente gli oggetti di sincronizzazione per l'articolo filtrato.

  3. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.

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

Per modificare un filtro colonne in modo da rimuovere colonne per un articolo pubblicato di una pubblicazione snapshot o transazionale

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_articlecolumn una volta per ogni colonna da rimuovere. Specificare il nome della colonna per @column e il valore drop per @operation.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_articleview. Specificare il nome della pubblicazione per @publication e il nome dell'articolo filtrato per @article. Se per la pubblicazione esistono sottoscrizioni, specificare il valore 1 per @change_active. Verranno creati nuovamente gli oggetti di sincronizzazione per l'articolo filtrato.

  3. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.

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

Per definire un filtro di colonna per un articolo pubblicato di una pubblicazione di tipo merge

  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_mergearticlecolumn. Verranno definite le colonne da includere o rimuovere dall'articolo.

    • Se si intende pubblicare solo alcune colonne di una tabella contenente molte colonne, eseguire sp_mergearticlecolumn una volta per ogni colonna da aggiungere. Specificare il nome della colonna per @column e il valore add per @operation.

    • Se si intende pubblicare la maggior parte delle colonna di una tabella contenente molte colonne, eseguire sp_mergearticlecolumn, specificando il valore null per @column e il valore add per @operation per aggiungere tutte le colonne. Eseguire quindi sp_mergearticlecolumn, una volta per ogni colonna da escludere, specificando il valore drop per @operation e il nome della colonna esclusa per @column.

Per modificare un filtro colonne in modo da includere colonne aggiuntive per un articolo pubblicato di una pubblicazione di tipo merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_mergearticlecolumn una volta per ogni colonna da aggiungere. Specificare il nome della colonna per @column, il valore add per @operation e il valore 1 sia per @force_invalidate_snapshot che per @force_reinit_subscription.

  2. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.

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

Per modificare un filtro colonne in modo da rimuovere colonne per un articolo pubblicato di una pubblicazione di tipo merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_mergearticlecolumn una volta per ogni colonna da rimuovere. Specificare il nome della colonna per @column, il valore drop per @operation e il valore 1 sia per @force_invalidate_snapshot che per @force_reinit_subscription.

  2. Rieseguire il processo dell'agente snapshot per la pubblicazione per generare uno snapshot aggiornato.

  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 la colonna DaysToManufacture viene rimossa da un articolo basato sulla tabella Product.

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 la colonna CreditCardApprovalCode viene rimossa da un articolo basato sulla tabella SalesOrderHeader.

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