Como definir um artigo (Programação Transact-SQL de replicação)

Após a criação da publicação, artigos poderão ser criados de forma programática, usando os procedimentos armazenados da replicação. Os procedimentos armazenados usados para criar um artigo dependem do tipo de publicação para o qual o artigo é definido. Para obter mais informações, consulte Como criar uma publicação (Programação Transact-SQL de replicação).

ObservaçãoObservação

Os nomes de artigos não podem incluir nenhum dos caracteres a seguir: % , * , [ , ] , | , : , " , ? , ' , \ , / , < , >. Se algum objeto do banco de dados incluir qualquer um desses caracteres, para replicá-los será necessário especificar um nome de artigo que seja diferente do nome do objeto.

Para definir um artigo para um instantâneo ou publicação transacional

  1. No Publicador do banco de dados de publicação, execute sp_addarticle. Especifique o nome da publicação à qual o artigo pertence para @publication; um nome para o artigo para @article; um objeto de banco de dados sendo publicado para @source_object, e qualquer outro parâmetro opcional. Use @ source_owner para especificar a propriedade de esquema do objeto; do contrário, use dbo. Se o artigo não for um artigo de tabela baseado em log, especifique o tipo de artigo para @type. Para obter mais informações, consulte Como especificar tipos de artigo (Programação Transact-SQL de replicação).

  2. Para filtrar linhas horizontalmente em uma tabela ou exibir um artigo, use sp_articlefilter para definir a cláusula de filtro. Para obter mais informações, consulte Como definir e modificar um filtro de linhas estático (Programação Transact-SQL de replicação).

  3. Para filtrar colunas verticalmente em uma tabela ou exibir um artigo, use sp_articlecolumn. Para obter mais informações, consulte Como definir e modificar um filtro de coluna (Programação Transact-SQL de replicação).

  4. Execute sp_articleview se o artigo for filtrado.

  5. Se a publicação tiver assinaturas existentes e sp_helppublication retornar um valor de 0 na coluna immediate_sync, será preciso chamar sp_addsubscription para adicionar o artigo a cada uma das assinaturas existentes.

  6. Se a publicação tiver assinaturas pull existentes, execute sp_refreshsubscriptions no Publicador para criar um novo instantâneo para as assinaturas pull existentes que contêm apenas o novo artigo.

    ObservaçãoObservação

    Para assinaturas que não são iniciadas por meio de instantâneo, não há necessidade de executar sp_refreshsubscriptions, uma vez que esse procedimento é executado por sp_addarticle.

Para definir um artigo para uma publicação de mesclagem

  1. No Publicador do banco de dados de publicação, execute sp_addmergearticle. Especifique o nome da publicação para @publication; um nome de artigo para @article e o objeto sendo publicado para @source_object. Para filtrar horizontalmente linhas de tabelas, especifique um valor para @subset_filterclause. Para obter mais informações, consulte Como definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem (Programação Transact-SQL de replicação) e Como definir e modificar um filtro de linhas estático (Programação Transact-SQL de replicação). Se o artigo não for um artigo de tabela, especifique o tipo de artigo para @type. Para obter mais informações, consulte Como especificar tipos de artigo (Programação Transact-SQL de replicação).

  2. (Opcional) No Assinante do banco de dados de publicação, execute sp_addmergefilter para definir um filtro de junção entre dois artigos. Para obter mais informações, consulte Como definir e modificar um filtro de junção entre artigos de mesclagem (Programação Transact-SQL de replicação).

  3. (Opcional) No Publicador do banco de dados de publicação, execute sp_mergearticlecolumn para filtrar colunas de tabela. Para obter mais informações, consulte Como definir e modificar um filtro de coluna (Programação Transact-SQL de replicação).

Exemplo

Esse exemplo define um artigo com base na tabela Produto para uma publicação transacional, onde o artigo é filtrado tanto horizontal como 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

Esse exemplo define artigos para uma publicação de mesclagem, onde o artigo SalesOrderHeader é filtrado estatisticamente com base em SalesPersonID, e o artigo SalesOrderDetail é filtrado por junção, com base em 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