Procedura: Definizione di un articolo (programmazione Transact-SQL della replica)

Dopo aver creato una pubblicazione, è possibile creare gli articoli a livello di programmazione tramite le codice stored procedure di replica. Le stored procedure utilizzate per creare un articolo dipendono dal tipo di pubblicazione per il quale viene definito l'articolo. Per ulteriori informazioni, vedere Procedura: Creazione di una pubblicazione (programmazione Transact-SQL della replica).

[!NOTA]

I nomi di articolo non possono includere i caratteri seguenti: %, *, [,], |: ?" , ' , \ , / , < , >. Se si desidera replicare oggetti del database che includono uno qualsiasi di questi caratteri, è necessario specificare un nome di articolo diverso dal nome dell'oggetto.

Per definire un articolo per una pubblicazione snapshot o transazionale

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addarticle. Specificare il nome della pubblicazione cui appartiene l'articolo per @publication, il nome dell'articolo per @article, l'oggetto di database da pubblicare per @source_object ed eventuali altri parametri facoltativi. Utilizzare @source_owner per specificare la proprietà dello schema dell'oggetto, se diversa da dbo. Se l'articolo non è un articolo di tabella basato su log, specificare il tipo di articolo per @type. Per ulteriori informazioni, vedere Procedura: Impostazione dei tipi di articolo (programmazione Transact-SQL della replica).

  2. Per filtrare in senso orizzontale le righe di una tabella o visualizzare un articolo, utilizzare sp_articlefilter per definire la clausola di filtro. Per ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro di riga statico (programmazione Transact-SQL della replica).

  3. Per filtrare in senso verticale le colonne di una tabella o visualizzare un articolo, utilizzare sp_articlecolumn. Per ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro di colonna (programmazione Transact-SQL della replica).

  4. Eseguire sp_articleview se l'articolo è filtrato.

  5. Se per la pubblicazione esistono sottoscrizioni e sp_helppublication restituisce il valore 0 nella colonna immediate_sync, è necessario chiamare sp_addsubscription per aggiungere l'articolo a ogni sottoscrizione esistente.

  6. Se per la pubblicazione esistono sottoscrizioni pull, eseguire sp_refreshsubscriptions nel server di pubblicazione per creare un nuovo snapshot per le sottoscrizioni pull esistenti contenente solo il nuovo articolo.

    [!NOTA]

    Per le sottoscrizioni non inizializzate tramite snapshot, non è necessario eseguire sp_refreshsubscriptions poiché tale procedura viene eseguita da sp_addarticle.

Per definire un articolo per una pubblicazione di tipo merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle. Specificare il nome della pubblicazione per @publication, il nome dell'articolo per @article e l'oggetto da pubblicare per @source_object.. Per filtrare in senso orizzontale le righe della tabella, specificare un valore per @subset_filterclause. Per ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro di riga con parametri per un articolo di merge (programmazione Transact-SQL della replica) e Procedura: Definizione e modifica di un filtro di riga statico (programmazione Transact-SQL della replica). Se l'articolo non è un articolo di tabella, specificare il tipo di articolo per @type. Per ulteriori informazioni, vedere Procedura: Impostazione dei tipi di articolo (programmazione Transact-SQL della replica).

  2. (Facoltativo) Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergefilter per definire un filtro di join tra due articoli. Per ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro join tra articoli di merge (programmazione Transact-SQL della replica).

  3. (Facoltativo) Nel database di pubblicazione del server di pubblicazione eseguire sp_mergearticlecolumn per filtrare le colonne della tabella. Per ulteriori informazioni, vedere Procedura: Definizione e modifica di un filtro di colonna (programmazione Transact-SQL della replica).

Esempio

In questo esempio viene definito un articolo basato sulla tabella Product per una pubblicazione transazionale, in cui l'articolo è filtrato in senso orizzontale e verticale.

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 vengono definiti gli articoli per una pubblicazione di tipo merge, in cui l'articolo SalesOrderHeader è filtrato in modo statico in base a SalesPersonID e l'articolo SalesOrderDetail è filtrato con filtro join in base a 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