Definizione e modifica di un filtro colonne

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Questo argomento descrive come definire e modificare un filtro colonne in SQL Server tramite SQL Server Management Studio o Transact-SQL.

Contenuto dell'articolo

Prima di iniziare

Limitazioni e restrizioni

  • Alcune colonne non possono essere filtrate. Per altre informazioni, vedere Filtrare i dati pubblicati. Se si modifica un filtro di colonna dopo l'inizializzazione delle sottoscrizioni, dopo la modifica è necessario generare un nuovo snapshot e reinizializzare tutte le sottoscrizioni. Per altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.

Utilizzo di SQL Server Management Studio

Definire i filtri colonne nella pagina Articoli della Creazione guidata nuova pubblicazione. Per altre informazioni sull'uso della Creazione guidata nuova pubblicazione, vedere Creare una pubblicazione.

Definire e modificare i filtri di colonna nella pagina Articoli della finestra di dialogo Proprietà pubblicazione - <Pubblicazione>. Per altre informazioni sulla modifica delle proprietà di pubblicazione, vedere Visualizzare e modificare le proprietà della pubblicazione.

Per definire un filtro colonne

  1. Nella pagina Articoli della Creazione guidata nuova pubblicazione espandere la tabella da filtrare nel riquadro Oggetti da pubblicare .

  2. Deselezionare la casella di controllo accanto a ogni colonna che si desidera filtrare.

Per modificare l'applicazione di filtri di colonna

  1. Nella pagina Articoli della finestra di dialogo Proprietà pubblicazione - <Pubblicazione> espandere la tabella da filtrare nel riquadro Oggetti da pubblicare.

  2. Deselezionare la casella di controllo accanto a ogni colonna che si desidera filtrare e verificare che la casella di controllo sia selezionata per ogni colonna da includere nell'articolo.

  3. Seleziona OK.

Utilizzo di Transact-SQL

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.

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 Apportare 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 altre informazioni, vedere definire un articolo.

  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. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

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. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

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

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

  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. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

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. Reinizializzazione delle sottoscrizioni. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

Esempio (Transact-SQL)

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

Modificare le proprietà di pubblicazioni e articoli
Filtrare i dati pubblicati
Filtrare i dati pubblicati per la replica di tipo merge