Implemente um resolvedor de conflitos personalizado para um artigo de fusão

Aplica-se a: SQL Server

Este tópico descreve como implementar um resolvedor de conflitos personalizado para um artigo Merge em SQL Server usando Transact-SQL ou um resolvedor personalizado baseado em COM.

Usando Transact-SQL

Pode escrever o seu próprio resolvedor de conflitos personalizado como um procedimento Transact-SQL armazenado em cada Publisher. Durante a sincronização, este procedimento armazenado é invocado quando surgem conflitos num artigo onde o resolvedor estava registado. A informação sobre a linha de conflito é transmitida pelo Merge Agent aos parâmetros obrigatórios do procedimento. Os resolvedores de conflitos personalizados baseados em procedimentos armazenados são sempre criados no Publisher.

Note

Os resolvedores de procedimentos armazenados do Microsoft SQL Server são invocados apenas para lidar com conflitos baseados em alterações de linhas. Não podem ser usados para lidar com outros tipos de conflitos, como falhas de inserção desencadeadas por violações de CHAVE PRIMÁRIA ou violações de restrições únicas de índice.

Criar um resolvedor de conflitos personalizado baseado em procedimentos armazenados

  1. No Publisher, seja na base de dados de publicação ou msdb, crie um novo procedimento armazenado do sistema que implemente os seguintes parâmetros exigidos:

    Parâmetro Tipo de dados Description
    @tableowner sysname Nome do proprietário da mesa para a qual está a ser resolvido um conflito. Este é o proprietário da tabela na base de dados de publicações.
    @tablename sysname Nome da tabela para a qual um conflito está a ser resolvido.
    @rowguid uniqueidentifier Identificador único da linha que apresenta o conflito.
    @subscriber sysname Nome do servidor a partir do qual uma alteração conflitante está a ser propagada.
    @subscriber_db sysname Nome da base de dados a partir da qual uma alteração conflitante está a ser propagada.
    @log_conflict SAÍDA int Define se o processo de fusão deve registar um conflito para resolução posterior:

    0 = Não registar o conflito.

    1 = O assinante é o perdedor do conflito.

    2 = Publisher é o perdedor do conflito.
    @conflict_message SAÍDA nvarchar(512) Mensagem a apresentar relativa à resolução caso o conflito seja registado.
    @destowner sysname O proprietário da tabela publicada no Subscritor.

    Este procedimento armazenado utiliza os valores passados pelo Merge Agent para estes parâmetros para implementar a sua lógica personalizada de resolução de conflitos. Deve devolver um único conjunto de resultados de linha idêntico em estrutura à tabela base e que contenha os valores de dados da versão vencedora da linha.

  2. Atribua permissões de EXECUTE no procedimento armazenado a quaisquer logins utilizados pelos Subscritores para se ligarem ao Publicador.

Use um resolvedor de conflitos personalizado com um novo artigo de tabela

  1. Execute sp_addmergearticle para definir um artigo.

  2. Especifique um valor de MicrosoftSQLServer Stored Procedure Resolver para o parâmetro @article_resolver .

  3. Especifique o nome do procedimento armazenado que implementa a lógica de resolução de conflitos para o parâmetro @resolver_info .

    Para mais informações, consulte Definir um artigo.

Utilizar um resolvedor de conflitos personalizado com um artigo de tabela já existente

  1. Executar sp_changemergearticle, especificando @publication, @article, um valor de article_resolver para @property e um valor do MicrosoftSQLServer Stored Procedure Resolver para @value.

  2. Executar sp_changemergearticle, especificando @publication, @article, um valor de resolver_info para @property e o nome do procedimento armazenado que implementa a lógica de resolução de conflitos para @value.

Utilização de um resolvedor personalizado baseado em COM

O Microsoft.SqlServer.Replication.BusinessLogicSupport namespace implementa uma interface que permite escrever lógica de negócio complexa para lidar com eventos e resolver conflitos que ocorrem durante o processo de sincronização de replicação por fusão. Para mais informações, consulte Implementar um Gestor de Lógica de Negócio para um artigo sobre fusão. Também pode escrever a sua própria lógica de negócio personalizada baseada em código nativo para resolver conflitos. Esta lógica é construída como um componente COM e compilada em bibliotecas de ligação dinâmica (DLLs), utilizando produtos como o Microsoft Visual C++. Este tipo de resolução personalizada de conflitos baseada em COM deve implementar a interface ICustomResolver , que é especificamente concebida para resolução de conflitos.

Criar e registar um resolvedor de conflitos personalizado baseado em COM

  1. Num ambiente de autoria compatível com COM, adicione referências à biblioteca Custom Conflict Resolver.

  2. Para um projeto Visual C++, use a diretiva #import para importar esta biblioteca para o seu projeto.

  3. Crie uma classe que implemente a interface ICustomResolver .

  4. Implemente certos métodos e propriedades.

  5. Constrói o projeto para criar o ficheiro de biblioteca de resolução de conflitos personalizado.

  6. Implemente a biblioteca no diretório que contém o executável Merge Agent (normalmente \Microsoft SQL Server\100\COM).

    Note

    Um resolvedor de conflitos personalizado deve ser implementado no Assinante para uma subscrição pull, no Distribuidor para uma subscrição push, ou no servidor Web usado com a sincronização Web.

  7. Regista a biblioteca personalizada do resolvedor de conflitos executando regsvr32.exe a partir do diretório de implementação da seguinte forma:

    regsvr32.exe mycustomresolver.dll  
    
  8. No Publisher, execute sp_enumcustomresolvers (Transact-SQL) para verificar se a biblioteca não está já registada como um resolvedor personalizado de conflitos.

  9. Para registar a biblioteca como um resolvedor de conflitos personalizado, execute sp_registercustomresolver (Transact-SQL) no Distribuidor. Especifique o nome amigável do objeto COM para @article_resolver, o ID da biblioteca (CLSID) para @resolver_clsid e um valor de false para @is_dotnet_assembly.

    Note

    Quando já não for necessário, pode cancelar o registo de um resolvedor de conflitos personalizado usando sp_unregistercustomresolver (Transact-SQL).

  10. (Opcional) Num cluster, repita os passos 6-9 para registar o resolver personalizado em todos os nós do cluster. Estes passos são necessários para garantir que o resolvedor personalizado consegue carregar corretamente o reconciler após um failover.

Utilizar um resolvedor de conflitos personalizado com um novo artigo de tabela

  1. No Publicador, execute sp_enumcustomresolvers (Transact-SQL) e anote o nome amigável do resolver pretendido.

  2. No Publicador da base de dados de publicações, execute sp_addmergearticle (Transact-SQL) para definir um artigo. Especifique o nome amigável do resolvedor de artigos a partir do passo 1 para @article_resolver. Para mais informações, consulte Definir um artigo.

Utilizar um resolvedor de conflitos personalizado com um artigo de tabela já existente

  1. No Publicador, execute sp_enumcustomresolvers (Transact-SQL) e anote o nome amigável do resolver pretendido.

  2. Execute sp_changemergearticle (Transact-SQL), especificando @publication, @article, um valor de article_resolver para @property e o nome amigável do resolvedor de artigos do passo 1 para @value.