Partilhar via


sp_addmergefilter (Transact-SQL)

Adiciona um novo filtro de mesclagem para criar uma partição com base em uma junção com outra tabela. Esse procedimento armazenado é executado no Publicador, no banco de dados de publicação.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

sp_addmergefilter [ @publication = ] 'publication' 
        , [ @article = ] 'article' 
        , [ @filtername = ] 'filtername' 
        , [ @join_articlename = ] 'join_articlename' 
        , [ @join_filterclause = ] join_filterclause
    [ , [ @join_unique_key = ] join_unique_key ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]
    [ , [ @filter_type = ] filter_type ]

Argumentos

  • [ @publication= ] 'publication'
    É o nome da publicação à qual o filtro de mesclagem está sendo adicionado. publication é sysname, sem padrão.

  • [ @article= ] 'article'
    É o nome do artigo ao qual o filtro de mesclagem está sendo adicionado. article é sysname, sem padrão.

  • [ @filtername= ] 'filtername'
    É o nome do filtro. filtername é um parâmetro obrigatório. filternameé sysname, sem padrão.

  • [ @join_articlename= ] 'join_articlename'
    É o artigo pai, ao qual o artigo filho, especificado por article, deve ser unido, usando a cláusula de junção especificada join_filterclause, para determinar as linhas no artigo filho que atendem aos critérios de pesquisa do filtro de mesclagem. join_articlename é sysname, sem padrão. O artigo deve estar na publicação fornecida por publication.

  • [ @join_filterclause= ] join_filterclause
    É a cláusula de junção que deve ser usada para unir o artigo filho especificado por article ao artigo pai especificado por join_article, para determinar as linhas qualificadas para o filtro de mesclagem. join_filterclause é nvarchar(1000).

  • [ @join_unique_key= ] join_unique_key
    Especifica se a junção entre o artigo pai article e o artigo filho join_article é de um para um, muitos para um ou muitos para muitos. join_unique_key é int, com um padrão 0. 0 indica uma junção muitos para um ou muitos para muitos. 1 indica uma junção um para um ou um para muitos. Esse valor sé 1 quando as colunas de junção formam uma chave exclusiva em join_article, ou se join_filterclause estiver entre uma chave estrangeira em article e uma chave primária em join_article.

    Observação sobre cuidadosCuidado

    Só defina esse parâmetro como 1 se você tiver uma restrição na coluna de junção na tabela subjacente para o artigo pai que garanta a exclusividade. Se join_unique_key for definido incorretamente como 1, poderá ocorrer não-convergência de dados.

  • [ @force_invalidate_snapshot= ] force_invalidate_snapshot
    Reconhece que a ação tomada por esse procedimento armazenado pode invalidar um instantâneo existente. force_invalidate_snapshot é um bit, com um padrão 0.

    0 especifica que as alterações no artigo de mesclagem não invalidam o instantâneo. Se o procedimento armazenado detectar que a alteração requer um novo instantâneo, ocorrerá um erro e nenhuma alteração será feita.

    1 especifica que as alterações no artigo de mesclagem podem invalidar o instantâneo e se houver assinaturas existentes que exigem um novo instantâneo, permitirá que o instantâneo existente seja marcado como obsoleto e um novo instantâneo seja gerado.

  • [ @force_reinit_subscription= ] force_reinit_subscription
    Reconhece que a ação tomada por esse procedimento armazenado pode requerer que as assinaturas existentes sejam reiniciadas. force_reinit_subscription é um bit, com um padrão 0.

    0 especifica que alterações no artigo de mesclagem não farão com que a assinatura seja reiniciada. Se o procedimento armazenado detectar que a alteração irá requerer que as assinaturas existentes sejam reiniciadas, ocorrerá um erro e nenhuma alteração será feita.

    1 especifica que alterações no artigo de mesclagem causarão a reinicialização de assinaturas existentes e dá permissão para que ocorra a reinicialização da assinatura.

  • [ @filter_type= ] filter_type
    Especifica o tipo de filtro que é adicionado. filter_type é tinyint e pode ser um dos valores a seguir.

    Valor

    Descrição

    1

    Somente filtro de junção. Exigido no suporte a Assinantes do SQL Server Compact 3.5 SP1.

    2

    Somente relação de registro lógico.

    3

    Relação de filtro de junção e registro lógico.

    Para obter mais informações, consulte Agrupando alterações a linhas relacionadas com registros lógicos.

Valores de código de retorno

0 (êxito) ou 1 (falha)

Comentários

sp_addmergefilter é usado em replicação de mesclagem.

sp_addmergefilter só pode ser usado com artigos de tabela. Artigos de exibição e exibição indexada não têm suporte.

Esse procedimento também pode ser usado para adicionar uma relação lógica entre dois artigos que podem ou não ter um filtro de junção entre eles. filter_type é usado para especificar se o filtro de mesclagem está sendo adicionado a um filtro de junção, a uma relação lógica ou ambos.

Para usar registros lógicos, a publicação e os artigos devem atender a vários requisitos. Para obter mais informações, consulte Agrupando alterações a linhas relacionadas com registros lógicos.

Geralmente, essa opção é usada para um artigo que tem uma referência de chave estrangeira para uma tabela de chave primária publicada, e, a tabela da chave primária tem um filtro definido nesse artigo. O subconjunto de linhas de chave primária é usado para determinar as linhas da chave estrangeira que são replicadas para o Assinante.

Você não pode adicionar um filtro de junção entre dois artigos publicados quando as tabelas de origem de ambos os artigos compartilham o mesmo nome de objeto de tabela. Nesse caso, mesmo que ambas as tabelas sejam de propriedade de esquemas diferentes e tenham nomes de artigo exclusivos, a criação do filtro de junção irá falhar.

Quando um filtro de linha e um filtro de junção com parâmetros são usados no mesmo artigo de tabela, a replicação determinará se uma linha pertence a uma partição de Assinante. Ela faz isso avaliando a função de filtro ou o filtro da junção (usando o operador OR ), em vez de avaliar a intersecção entre as duas condições (usando o operador AND).

Exemplo

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

Permissões

Somente membros da função de servidor fixa sysadmin ou da unção de banco de dados db_owner podem executar sp_addmergefilter.