Partilhar via


Como definir e modificar um filtro de linhas estático (Programação Transact-SQL de replicação)

Ao criar artigos de tabela, você pode definir uma cláusula WHERE para filtrar linhas para fora de um artigo. Você também pode alterar um filtro de linha depois que ele estiver definido. Os filtros de linhas estáticos podem ser criados e modificados programaticamente usando os procedimentos armazenados de replicação. Como estes filtros são estáticos, todos os assinantes receberão o mesmo subconjunto de dados. Se você precisa filtrar dinamicamente linhas em um artigo de tabela pertencente a uma publicação de mesclagem para que cada assinante receba uma partição diferente dos dados, consulte Como definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem (Programação Transact-SQL de replicação). A replicação de mesclagem também permite que você filtre linhas relacionadas com base em um filtro de linha existente. 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).

Para definir um filtro de linhas estático para 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 no banco de dados da publicação, execute sp_articlefilter (Transact-SQL). Especifique o nome do artigo para @article, o nome da publicação para @publication, um nome para o filtro para @filter_name, e a cláusula de filtragem para @filter_clause (não incluindo WHERE).

  3. Se um filtro de coluna ainda precisa ser definido, consulte Como definir e modificar um filtro de coluna (Programação Transact-SQL de replicação). Caso contrário, execute sp_articleview (Transact-SQL). Especifique o nome da publicação para @publication, o nome do artigo filtrado para @article, e a cláusula de filtragem especificada na etapa 2 para @filter_clause. Isto cria os objetos de sincronização para o artigo filtrado.

Para modificar um filtro de linhas estático para um instantâneo ou publicação transacional

  1. No Publicador no banco de dados da publicação, execute sp_articlefilter (Transact-SQL). Especifique o nome do artigo para @article, o nome da publicação para @publication, um nome para o novo filtro para @filter_name, e a nova cláusula de filtragem para @filter_clause (não incluindo WHERE). Como esta alteração invalidará dados em assinaturas existentes, especifique um valor de 1 para @force_reinit_subscription.

  2. No Publicador do banco de dados da publicação, execute sp_articleview (Transact-SQL). Especifique o nome da publicação para @publication, o nome do artigo filtrado para @article, e a cláusula de filtragem especificada na etapa 1 para @filter_clause. Isto recria a exibição que define o artigo filtrado.

  3. Execute novamente o trabalho do Snapshot Agent da publicação para gerar um instantâneo atualizado. Para obter mais informações, consulte Como criar o instantâneo inicial (Programação Transact-SQL de replicação).

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

Para excluir um filtro de linhas estático para um instantâneo ou publicação transacional

  1. No Publicador no banco de dados da publicação, execute sp_articlefilter (Transact-SQL). Especifique o nome do artigo para @article, o nome da publicação para @publication, um valor de NULL para @filter_name, e um valor de NULL para @filter_clause. Como esta alteração invalidará dados em assinaturas existentes, especifique um valor de 1 para @force_reinit_subscription.

  2. Execute novamente o trabalho do Snapshot Agent da publicação para gerar um instantâneo atualizado. Para obter mais informações, consulte Como criar o instantâneo inicial (Programação Transact-SQL de replicação).

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

Para definir um filtro de linhas estático para uma publicação de mesclagem

  1. No Publicador no banco de dados de publicação, execute sp_addmergearticle (Transact-SQL). Especifique a cláusula de filtragem para @subset_filterclause (não incluindo WHERE). Para obter mais informações, consulte Como definir um artigo (Programação Transact-SQL de replicação).

  2. Se um filtro de coluna ainda precisa ser definido, consulte Como definir e modificar um filtro de coluna (Programação Transact-SQL de replicação).

Modificar um filtro de linhas estático para uma publicação de mesclagem

  1. No Publicador no banco de dados de publicação, execute sp_changemergearticle (Transact-SQL). Especifique o nome da publicação para @publication, o nome do artigo filtrado para @article, um valor de subset_filterclause para @property, e a nova cláusula de filtragem para @value (não incluindo WHERE). Como esta alteração invalidará dados em assinaturas existentes, especifique um valor de 1 para @force_reinit_subscription.

  2. Execute novamente o trabalho do Snapshot Agent da publicação para gerar um instantâneo atualizado. Para obter mais informações, consulte Como criar o instantâneo inicial (Programação Transact-SQL de replicação).

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

Exemplo

Neste exemplo de replicação transacional, o artigo é filtrado horizontalmente para remover todos os produtos descontinuados.

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

Neste exemplo de replicação de mesclagem, os artigos são filtrados horizontalmente para retornar apenas linhas que pertencem ao vendedor especificado. Um filtro de junção também é usado. 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).

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