Cómo definir un artículo (programación de la replicación con Transact-SQL)

Una vez creada una publicación, los artículos se pueden crear mediante programación usando los procedimientos almacenados de replicación. Los procedimientos almacenados usados para crear un artículo dependerán del tipo de publicación para la que se está definiendo el artículo. Para obtener más información, vea Cómo crear una publicación (programación de la replicación con Transact-SQL).

Nota

Los nombres del artículo no pueden incluir ninguno de los caracteres siguientes: % , * , [ , ] , | , : , " , ? , ' , \ , / , < , >. Si los objetos de la base de datos incluyen cualquiera de estos caracteres y desea replicarlos, debe especificar un nombre de artículo diferente del nombre de objeto.

Para definir un artículo para una publicación transaccional o de instantáneas

  1. En la base de datos de publicación del publicador, ejecute sp_addarticle. Especifique el nombre de la publicación a la que pertenece el artículo para @publication, un nombre de artículo para @article, el objeto de base de datos que se está publicando para @source_objecty cualquier otro parámetro opcional. Use @source_owner para especificar la propiedad del esquema del objeto, si no es dbo. Si el artículo no es un artículo de tabla basada en registros, especifique el tipo de artículo para @type; para obtener más información, vea Cómo especificar los tipos de artículo (programación de la replicación con Transact-SQL).

  2. Para filtrar filas horizontalmente en una tabla o ver un artículo, use sp_articlefilter para definir la cláusula de filtro. Para obtener más información, vea Cómo definir y modificar un filtro de fila estático (programación de la replicación con Transact-SQL).

  3. Para filtrar columnas verticalmente en una tabla o ver un artículo, use sp_articlecolumn. Para obtener más información, vea Cómo definir y modificar un filtro de columna (programación de la replicación con Transact-SQL).

  4. Ejecute sp_articleview si se filtra el artículo.

  5. Si la publicación tiene suscripciones existentes y sp_helppublication devuelve un valor de 0 en la columna de immediate_sync, debe llamar a sp_addsubscription para agregar el artículo a cada suscripción existente.

  6. Si la publicación tiene suscripciones de extracción existentes, ejecute sp_refreshsubscriptions en el Publicador para crear una nueva instantánea para las suscripciones de extracción existentes que contienen únicamente el nuevo artículo.

    Nota

    Para las suscripciones que no se inicializan usando una instantánea, no tiene que ejecutar sp_refreshsubscriptions ya que este procedimiento lo ejecuta sp_addarticle.

Para definir un artículo para una publicación de combinación

  1. En la base de datos de publicación del publicador, ejecute sp_addmergearticle. Especifique el nombre de la publicación para @publication, un nombre para el nombre de artículo para @article y el objeto que se está publicando para @source_object. Para filtrar horizontalmente filas de tabla, especifique un valor para @subset_filterclause. Para obtener más información, vea Cómo definir y modificar un filtro de fila con parámetros para un artículo de mezcla (programación de la replicación con Transact-SQL) y Cómo definir y modificar un filtro de fila estático (programación de la replicación con Transact-SQL). Si el artículo no es un artículo de tabla, especifique el tipo de artículo para @type. Para obtener más información, vea Cómo especificar los tipos de artículo (programación de la replicación con Transact-SQL).

  2. (Opcional) En la base de datos de publicación del publicador, ejecute sp_addmergefilter para definir un filtro de combinación entre dos artículos. Para obtener más información, vea Cómo definir y modificar un filtro de combinación entre artículos de mezcla (programación de la replicación con Transact-SQL).

  3. (Opcional) En la base de datos de publicación del publicador, ejecute sp_mergearticlecolumn para filtrar columnas de tabla. Para obtener más información, vea Cómo definir y modificar un filtro de columna (programación de la replicación con Transact-SQL).

Ejemplo

Este ejemplo define un artículo basado en la tabla Producto para una publicación transaccional, donde el artículo se filtra horizontal y verticalmente.

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

Este ejemplo define artículos para una publicación de combinación, donde el artículo SalesOrderHeader se filtra estáticamente según SalesPersonID, y el artículo SalesOrderDetail se filtra por combinación según 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