Compartilhar via


Implementar um resolvedor de conflitos personalizado para um artigo de mesclagem

Aplica-se: SQL Server

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

Neste tópico

Usando o Transact-SQL

Você pode escrever seu próprio resolvedor de conflitos personalizado como um procedimento armazenado Transact-SQL em cada Publicador. Durante a sincronização, este procedimento armazenado é invocado quando são encontrados conflitos em um artigo no qual o resolvedor foi registrado. As informações sobre a linha de conflito são passadas pelo Agente de Mesclagem para os parâmetros necessários do procedimento. Resolvedores de conflito personalizados com base em procedimento armazenado sempre são criados no Publicador.

Observação

Os resolvedores de procedimentos armazenados do Microsoft SQL Server são invocados apenas para lidar com conflitos baseados em alterações de linha. Eles não podem ser usados para tratar outros tipos de conflitos como falhas de inserção acionadas por violações de PRIMARY KEY ou violações de restrições de índice exclusivo.

Para criar um resolvedor de conflitos personalizado com base em procedimentos armazenados

  1. No Publicador em cada publicação ou banco de dados msdb , crie um novo procedimento armazenado de sistema que implementa os seguintes parâmetros requeridos:

    Parâmetro Tipo de dados Descrição
    @tableowner sysname Nome do proprietário da tabela para a qual um conflito está estando resolvido. Esse é o proprietário para a tabela no banco de dados de publicação.
    tablename sysname Nome da tabela para a qual um conflito está estando resolvido.
    rowguid uniqueidentifier Identificador exclusivo da linha que tem o conflito.
    @subscriber sysname Nome do servidor do qual a alteração conflitante está sendo propagada.
    @subscriber_db sysname Nome do banco de dados do qual a alteração conflitante está sendo propagada.
    @log_conflict OUTPUT int Define se o processo de mesclagem deveria registrar o conflito para resolução posterior:

    0 = Não registre o conflito.

    1 = O Assinante é o perdedor de conflito.

    2 = O Publicador é o perdedor de conflito.
    @conflict_message OUTPUT nvarchar(512) Mensagem a ser dada sobre a resolução se o conflito for registrado.
    @destowner sysname O proprietário da tabela publicada no Assinante.

    Este procedimento armazenado usa os valores passados pelo Agente de Mesclagem para esses parâmetros para implementar a sua lógica de resolução de conflito personalizada. Ele deve retornar um conjunto de resultados de linha única que seja idêntico, em termos de estrutura, à tabela base e que contenha os valores de dados para a versão vencedora da linha.

  2. Conceda permissões EXECUTE no procedimento armazenado para qualquer logon usado por Assinantes para conexão com o Publicador.

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

  1. Execute sp_addmergearticle para definir um artigo.

  2. Especifique um valor igual a Resolvedor de Procedimentos Armazenados do Microsoft SQL Server no parâmetro @article_resolver

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

    Para saber mais, confira Definir um artigo.

Para usar um resolvedor de conflito personalizado com um artigo de tabela existente

  1. Execute sp_changemergearticle, especificando @publication, @article, um valor igual a article_resolver em @property e um valor igual a Resolvedor de Procedimentos Armazenados do Microsoft SQL Server em @value.

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

Como usar um resolvedor personalizado com base em COM

O namespace Microsoft.SqlServer.Replication.BusinessLogicSupport implementa uma interface que permite gravar lógicas empresariais complexas para tratar eventos e resolver conflitos que ocorram durante o processo de sincronização da replicação de Mesclagem. Para saber mais, confira como implementar um manipulador de lógica de negócios em um artigo de Mesclagem. Você também pode gravar sua própria lógica corporativa personalizada com base em código nativo para resolver conflitos. Essa lógica é criada como um componente COM e compilada em bibliotecas de vínculo dinâmico (DLLs), usando produtos como o Microsoft Visual C++. Esse tipo de resolvedor de conflitos personalizado com base em COM precisa implementar a interface ICustomResolver, que foi projetada especificamente para a resolução de conflitos.

Para criar e registrar um resolvedor de conflitos personalizado com base em COM

  1. Em um ambiente de criação compatível com o COM, adicione referências à biblioteca do Resolvedor de Conflitos Personalizado.

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

  3. Crie uma classe que implemente a interface ICustomResolver .

  4. Implemente certos métodos e propriedades.

  5. Construa o projeto para criar o arquivo da biblioteca do resolvedor de conflitos.

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

    Observação

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

  7. Registre a biblioteca do resolvedor de conflitos personalizado executando o regsvr32.exe no diretório de implantação, como segue:

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

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

    Observação

    Quando não for mais necessário, é possível cancelar o registro de um resolvedor de conflitos personalizado usando sp_unregistercustomresolver (Transact-SQL).

  10. (Opcional) Em um cluster, repita as etapas de 6 a 9 para registrar o resolvedor personalizado em todos os nós do cluster. Essas etapas são necessárias para garantir que o resolvedor personalizado possa carregar adequadamente o reconciliador, depois de um failover.

Para usar um resolvedor de conflito personalizado com um novo artigo de tabela

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

  2. No Publicador no banco de dados de publicação, execute o sp_addmergearticle (Transact-SQL) para definir um artigo. Especifique o nome amigável do resolvedor do artigo na etapa 1 para @article_resolver. Para saber mais, confira Definir um artigo.

Para usar um resolvedor de conflito personalizado com um artigo de tabela existente

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

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