Partilhar via


Como definir e modificar um filtro de coluna (Programação Transact-SQL de replicação)

Quando for criar artigos de tabela, você pode definir as colunas para serem incluídas no artigo e alterar as colunas após o artigo ter sido definido. Colunas filtradas podem ser criadas e modificadas de forma programada usando os procedimentos de replicação armazenados. Alguns tipos de colunas, como colunas identidade e rowguid, de um artigo publicado não podem ser removidas. Para obter mais informações, consulte Filtros de colunas no tópico Filtrando dados publicados.

ObservaçãoObservação

Os procedimentos a seguir assumem que a tabela subjacente não tenha sido alterada. Para obter informações sobre como replicar a linguagem de definição de dados (DDL) para tabelas publicadas, consulte Fazendo alterações de esquema em bancos de dados de publicação.

Para definir um filtro de coluna para um artigo publicado em um instantâneo ou publicação transacional

  1. Defina o artigo a ser filtrado. Para obter mais informações, consulte Como definir um artigo (Programação Transact-SQL de replicação).

  2. No Publicador do banco de dados de publicação, execute sp_articlecolumn. Isto define as colunas a serem incluídas ou removidas do artigo.

    • Se publicar apenas algumas colunas de uma tabela com várias colunas, execute sp_articlecolumn uma vez para cada coluna sendo adicionada. Especifique o nome de coluna para @column e um valor de adicionar para @operation.

    • Se publicar a maioria das colunas em uma tabela com várias colunas, execute sp_articlecolumn, especificando um valor de nulo para @column e um valor de adicionar para @operation para adicionar todas as colunas. Em seguida, execute sp_articlecolumn, uma vez para cada coluna sendo excluída, especificando o valor de descartar para @operation e o nome da coluna excluída para @column.

  3. No Publicador do banco de dados de publicação, execute sp_articleview. Especifique o nome da publicação para @publication e o nome do artigo filtrado para @article. Isto cria os objetos de sincronização para o artigo filtrado.

Para alterar um filtro de coluna para incluir colunas adicionais no artigo publicado em um instantâneo ou em uma publicação transacional

  1. No Publicador do banco de dados de publicação, execute sp_articlecolumn uma vez para cada coluna sendo adicionada. Especifique o nome de coluna para @column e um valor de adicionar para @operation.

  2. No Publicador do banco de dados de publicação, execute sp_articleview. Especifique o nome da publicação para @publication e o nome do artigo filtrado para @article. Se a publicação tiver assinaturas existentes, especifique um valor de 1 para @change_active. Isto cria novamente os objetos de sincronização para o artigo filtrado.

  3. Execute novamente o Snapshot Agent para a publicação para gerar um instantâneo atualizado.

  4. Reinicialize as assinaturas. Para obter mais informações, consulte Como reinicializar uma assinatura (Programação Transact-SQL de replicação).

Para alterar um filtro de coluna para remover colunas de um artigo publicado em um instantâneo ou em uma publicação transacional

  1. No Publicador do banco de dados de publicação, execute sp_articlecolumn uma vez para cada coluna sendo removida. Especifique o nome de coluna para @column e um valor de descartar para @operation.

  2. No Publicador do banco de dados de publicação, execute sp_articleview. Especifique o nome da publicação para @publication e o nome do artigo filtrado para @article. Se a publicação tiver assinaturas existentes, especifique um valor de 1 para @change_active. Isto cria novamente os objetos de sincronização para o artigo filtrado.

  3. Execute novamente o Snapshot Agent para a publicação para gerar um instantâneo atualizado.

  4. Reinicialize as assinaturas. Para obter mais informações, consulte Como reinicializar uma assinatura (Programação Transact-SQL de replicação).

Para definir um filtro de coluna para um artigo publicado em uma publicação de mesclagem

  1. Defina o artigo a ser filtrado. Para obter mais informações, consulte Como definir um artigo (Programação Transact-SQL de replicação).

  2. No Publicador do banco de dados de publicação, execute sp_mergearticlecolumn. Isto define as colunas a serem incluídas ou removidas do artigo.

    • Se publicar apenas algumas colunas de uma tabela com várias colunas, execute sp_mergearticlecolumn uma vez para cada coluna sendo adicionada. Especifique o nome de coluna para @column e um valor de adicionar para @operation.

    • Se publicar a maioria das colunas em uma tabela com várias colunas, execute sp_mergearticlecolumn, especificando um valor de nulo para @column e um valor de adicionar para @operation para adicionar todas as colunas. Em seguida, execute sp_mergearticlecolumn, uma vez para cada coluna sendo excluída, especificando o valor de descartar para @operation e o nome da coluna excluída para @column.

Para alterar um filtro de coluna para incluir colunas adicionais no artigo publicado em uma publicação de mesclagem

  1. No Publicador do banco de dados de publicação, execute sp_mergearticlecolumn uma vez para cada coluna sendo adicionada. Especifique o nome da coluna para @column, um valor de adicionar para @operation e um valor de 1 para ambos, @force_invalidate_snapshot e @force_reinit_subscription.

  2. Execute novamente o Snapshot Agent para a publicação a fim de gerar um instantâneo atualizado.

  3. Reinicialize as assinaturas. Para obter mais informações, consulte Como reinicializar uma assinatura (Programação Transact-SQL de replicação).

Para alterar um filtro de coluna para remover colunas de um artigo publicado em uma publicação de mesclagem

  1. No Publicador do banco de dados de publicação, execute sp_mergearticlecolumn uma vez para cada coluna sendo removida. Especifique o nome da coluna para @column, um valor de descartar para @operation e um valor de 1 para ambos, @force_invalidate_snapshot e @force_reinit_subscription.

  2. Execute novamente o Snapshot Agent da publicação para gerar um instantâneo atualizado.

  3. Reinicialize as assinaturas. Para obter mais informações, consulte Como reinicializar uma assinatura (Programação Transact-SQL de replicação).

Exemplo

Nesse exemplo de replicação transacional, a coluna DaysToManufacture é removida de um artigo com base na tabela Produto.

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

Nesse exemplo de replicação de mesclagem, a coluna CreditCardApprovalCode é removida de um artigo com base na tabela 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