Partilhar via


Definir e modificar um filtro de linha estático

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

Neste tópico

  • Antes de começar:

    Limitações e restrições

    Recomendações

  • Para definir e modificar um filtro de linhas estático usando:

    SQL Server Management Studio

    Transact-SQL

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

Ícone de seta usado com o link Voltar ao Início[Top]

Usando o SQL Server Management Studio

Defina, modifique e exclua filtros de linhas estáticos na página Filtrar Linhas da Tabela no Assistente para Nova Publicação ou na página Filtrar Linhas da caixa de diálogo Propriedades de Publicação – <Publicação>. Para obter mais informações sobre como usar o assistente e acessar a caixa de diálogo, consulte Crie uma publicação e Visualizar 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 de Publicação – <Publicação>, a ação a ser tomada dependerá do tipo de publicação:

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

    • Para uma publicação de mesclagem, clique em Adicionar e 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çãoObservaçã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 de 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 de Publicação – <Publicação>, selecione um filtro no painel Tabelas Filtradas e depois 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

  • 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 de Publicação – <Publicação>, selecione um filtro no painel Tabelas Filtradas e depois clique em Excluir.

Ícone de seta usado com o link Voltar ao Início[Top]

Usando 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 Defina um Artigo.

  2. No Publicador do 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 Definir e modificar um filtro de colunas. 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 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 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 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 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 Defina um Artigo.

  2. Se um filtro de coluna ainda precisa ser definido, consulte Definir e modificar um filtro de colunas.

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 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

Ícone de seta usado com o link Voltar ao Início[Top]

Consulte também

Conceitos

Definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem

Alterar propriedades da publicação e do artigo

Filtrar dados publicados

Filtrar dados publicados para replicação de mesclagem