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
- 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 Definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem. 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 Definir e modificar um filtro de junção entre artigos de mesclagem.
[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
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.
Na caixa de diálogo Adicionar Filtro, selecione uma tabela para filtrar na caixa de listagem suspensa.
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
Clique em OK.
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
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.
Na caixa de diálogo Editar Filtro, modifique o filtro.
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.
[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
Defina o artigo a ser filtrado. Para obter mais informações, consulte Defina um Artigo.
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).
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
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.
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.
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.
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
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.
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.
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
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.
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
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.
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.
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
[Top]
Consulte também
Conceitos
Definir e modificar um filtro de linha com parâmetros para um artigo de mesclagem