Compartilhar via


Definir e modificar um filtro de linha estático

Este tópico descreve como definir e modificar um filtro de linha estático no SQL Server 2014 usando SQL Server Management Studio ou Transact-SQL.

Neste tópico

Antes de começar

Limitações e Restrições

  • Se você adicionar, modificar ou excluir um filtro de linhas estático após a inicialização de assinaturas na publicação, será preciso gerar um novo instantâneo e reinicializar todas as assinaturas depois de fazer a alteração. Para obter mais informações sobre os requisitos para alterações de propriedades, consulte Alterar propriedades da publicação e do artigo.

  • Se a publicação estiver habilitada para replicação transacional ponto a ponto, as tabelas não poderão ser filtradas.

Recomendações

Como usar o SQL Server Management Studio.

Defina, modifique e exclua filtros de linha estáticos na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades da Publicação – <Publicação> . Para obter mais informações sobre como usar o assistente e acessar a caixa de diálogo, consulte Criar uma publicação e Exibir e modificar as propriedades da publicação.

Para definir um filtro de linhas estático

  1. Na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades da Publicação – <Publicação> , a ação que você executar depende do tipo de publicação:

    • Para um instantâneo ou publicação transacional, clique em Adicionar.

    • Para uma publicação de mesclagem, clique em Adicionare então clique em Adicionar filtro.

  2. Na caixa de diálogo Adicionar Filtro , selecione uma tabela para filtrar na caixa de listagem suspensa.

  3. Crie uma instrução de filtro na área de texto Instrução de filtro . Você pode digitar diretamente na área de texto e também pode arrastar e soltar colunas da caixa de listagem Colunas .

    Observação

    A cláusula WHERE deve usar nomeação de duas partes; nomeação de três partes e nomeação de quatro partes não são suportadas. Se a publicação for de um Editor Oracle, a cláusula WHERE deve estar compatível com a sintaxe do Oracle.

    • A área de texto Instrução de filtro inclui o texto padrão que está no formato de:

      SELECT <published_columns> FROM [schema].[tablename] WHERE  
      
    • O texto padrão não pode ser alterado; digite a cláusula de filtro depois da palavra-chave WHERE usando sintaxe padrão do SQL. A cláusula de filtro completa aparecerá como:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE [LoginID] = 'adventure-works\ranjit0'  
      
    • Um filtro de linhas estático pode incluir uma função definida pelo usuário. A cláusula de filtro completa para um filtro de linhas estático com uma função definida pelo usuário será exibida como:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] WHERE MyFunction([Freight]) > 100  
      
  4. Clique em OK.

  5. Se você estiver na caixa de diálogo Propriedades da Publicação – <Publicação> , clique em OK para salvar e fechar a caixa de diálogo.

Para modificar um filtro de linhas estático

  1. Na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades da Publicação – <Publicação> , selecione um filtro no painel Tabelas Filtradas e clique em Editar.

  2. Na caixa de diálogo Editar Filtro , modifique o filtro.

  3. Clique em OK.

Para excluir um filtro de linhas estático

  1. Na página Filtrar Linhas da Tabela do Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades da Publicação – <Publicação> , selecione um filtro no painel Tabelas Filtradas e clique em Excluir.

Usando o Transact-SQL

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.

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 Define an Article.

  2. No Publicador do banco de dados de 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 (sem incluir WHERE).

  3. Se um filtro de coluna ainda precisa ser definido, consulte Define and Modify a Column Filter. 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 filtro 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 do banco de dados de 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 (sem incluir WHERE). Como essa alteração invalidará dados em assinaturas existentes, especifique um valor de 1 para @force_reinit_subscription.

  2. No Publicador do banco de dados de 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 filtro especificada na etapa 1 para @filter_clause. Isto recria a exibição que define o artigo filtrado.

  3. Execute novamente o Snapshot Agent da publicação para gerar um instantâneo atualizado. Para obter mais informações, consulte Criar e aplicar o instantâneo inicial.

  4. Reinicialize as assinaturas. Para obter mais informações, consulte Reinicializar as assinaturas.

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

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

  2. Execute novamente o Snapshot Agent da publicação para gerar um instantâneo atualizado. Para obter mais informações, consulte Criar e aplicar o instantâneo inicial.

  3. Reinicialize as assinaturas. Para obter mais informações, consulte Reinicializar as assinaturas.

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

  1. No Publicador do banco de dados de publicação, execute sp_addmergearticle (Transact-SQL). Especifique a cláusula de filtragem para @subset_filterclause (sem incluir WHERE). Para obter mais informações, consulte Define an Article.

  2. Se um filtro de coluna ainda precisa ser definido, consulte Define and Modify a Column Filter.

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

  1. No Publicador do 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 (sem incluir WHERE). Como essa alteração invalidará dados em assinaturas existentes, especifique um valor de 1 para @force_reinit_subscription.

  2. Execute novamente o Snapshot Agent da publicação para gerar um instantâneo atualizado. Para obter mais informações, consulte Criar e aplicar o instantâneo inicial.

  3. Reinicialize as assinaturas. Para obter mais informações, consulte Reinicializar as assinaturas.

Exemplos (Transact-SQL)

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 Definir e modificar um filtro de junção entre artigos de mesclagem.

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

Consulte Também

Definir e modificar um filtro de linha parametrizado para um artigo de mesclagem
Alterar propriedades da publicação e do artigo
Filtrar os dados publicados
Filtrar dados publicados para a replicação de mesclagem