Implementar o resolvedor de conflitos personalizado para um artigo de mesclagem

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

Neste tópico

  • Para implementar o resolvedor de conflitos personalizado para um artigo de mesclagem, usando:

    Transact-SQL

    Resolvedor baseado em COM

Usando Transact-SQL

Você pode escrever seu próprio resolvedor de conflito personalizado como um procedimento armazenado Transact-SQL em cada Publicador. Durante a sincronização, esse procedimento armazenado será invocado quando forem encontrados conflitos em um artigo para o qual o resolvedor foi registrado, e a informação na linha em conflito é passada pelo Agente de Mesclagem para os parâmetros requeridos do procedimento. Resolvedores de conflito personalizados com base em procedimento armazenado sempre são criados no Publicador.

ObservaçãoObservação

Só serão invocados os resolvedores de procedimento armazenado do Microsoft SQL Server para controlar conflitos de linha baseados em alterações. Eles não podem ser usados para tratar de outros tipos de conflitos como falhas de inserção devido a 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 para a linha que tem o conflito.

    @subscriber

    sysname

    Nome do servidor de onde uma alteração conflitante está sendo propagada.

    @subscriber_db

    sysname

    Nome do banco de dados de onde uma alteração conflitante está sendo propagada.

    @log_conflict OUTPUT

    int

    Se o processo de mesclagem deveria registrar um 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.

    Esse procedimento armazenado usa os valores passados pelo Agente de Mesclagem para esses parâmetros para implementar sua lógica de resolução de conflito personalizada; ele deverá retornar um conjunto de resultados de linha única que é idêntico em estrutura à tabela base e contem 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.

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

  • Execute sp_addmergearticle para definir um artigo, especificando o valor de Resolvedor de Procedimentos Armazenados do Microsoft SQL Server para o parâmetro @article_resolver e o nome do procedimento armazenado que implementa a lógica do resolvedor de conflitos para o parâmetro @resolver_info. Para obter mais informações, consulte Defina um Artigo.

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

  1. Execute sp_changemergearticle, especificando @publication, @article, um valor de article_resolver para @property e um valor de Resolvedor de Procedimentos Armazenados doMicrosoft SQL Server para @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.

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

Usando um resolvedor personalizado com base em COM

O namespace Microsoft.SqlServer.Replication.BusinessLogicSupport implementa uma interface, permitindo que você grave lógicas empresariais complexas para manipular eventos e resolva conflitos que ocorram durante o processo de sincronização da replicação de mesclagem. Para obter mais informações, consulte Implementar um manipulador de lógica de negócios para um artigo de mesclagem. Você também pode escrever 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 (DLL), usando produtos como o Microsoft Visual C++. O resolvedor de conflitos personalizado com base em COM deve implementar a interface ICustomResolver, que é projetada especificamente para 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çãoObservaçã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 usando o regsvr32.exe do 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_clsid e um valor de false para @is_dotnet_assembly.

    ObservaçãoObservação

    Quando não for mais necessário, um resolvedor de conflitos personalizado poderá ser registrado, usando sp_unregistercustomresolver (Transact-SQL).

  10. (Opcional) Em um cluster, repita as etapas de 5 a 8 para registrar o resolvedor personalizado em todos os nós do cluster. Isso é necessário para garantir que o resolvedor personalizado esteja apto a carregar adequadamente o reconciliador, seguindo um failover.

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

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

  2. No Publicador do banco de dados de publicação, execute sp_addmergearticle (Transact-SQL) para definir um artigo. Especifique o nome amigável do resolvedor do artigo na etapa 1 para @article_resolver. Para obter mais informações, consulte Defina um Artigo.

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

  1. No Publicador, execute sp_enumcustomresolvers (Transact-SQL) e observe 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 do artigo na etapa 1 para @value.

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

Exibindo um resolvedor personalizado de exemplo

  1. Um exemplo está disponível nos arquivos de exemplo do SQL Server 2000. Baixe o sql2000samples.cab de Exemplos atualizados do SQL Server 2000 Service Pack 3. Serão baixados 8 arquivos somando 6,9 MB.

  2. Extraia os arquivos do arquivo .cab compactado que foi baixado.

  3. Execute setup.exe

    ObservaçãoObservação

    Ao escolher as opções de instalação, é necessário apenas instalar os exemplos de Replicação. (O caminho de instalação padrão é C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\)

  4. Vá para a pasta de instalação. (A pasta padrão é C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe)

  5. Execute o programa unzip_sqlreplSP3.exe.

    ObservaçãoObservação

    O resolvedor com de exemplo será instalado (por padrão) na pasta C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres.

  6. Na pasta subspres, localize todas as ocorrências de #include sqlres.h em todos os arquivos de origem e substitua-as por #import "replrec.dll" no_namespace, raw_interfaces_only

Consulte também

Conceitos

Detecção e resolução de conflito de replicação de mesclagem avançada

Resolvedores personalizados com base em COM

Práticas recomendadas em relação à segurança de replicação