Implementación de un solucionador de conflictos personalizado para un artículo de mezcla

Se aplica a:SQL Server

En este tema se describe cómo implementar un solucionador de conflictos personalizado para un artículo de mezcla en SQL Server mediante Transact-SQL o un solucionador personalizado basado en COM.

En este tema

Usar Transact-SQL

Puede escribir su propio solucionador de conflictos personalizado como un procedimiento almacenado Transact-SQL en cada publicador. Durante la sincronización, este procedimiento almacenado se invoca cuando se encuentran conflictos en un artículo en el que se ha registrado el solucionador. El Agente de mezcla pasa información sobre la fila del conflicto a los parámetros necesarios del procedimiento. Los solucionadores de conflictos personalizados basados en el procedimiento almacenado siempre se crean en el publicador.

Nota:

Los resolvedores de procedimientos almacenados de Microsoft SQL Server solo se invocan para solucionar conflictos debidos a cambios de fila. No se pueden utilizar para solucionar otros tipos de conflictos como errores de inserción desencadenados por infracciones de CLAVE PRINCIPAL o por infracciones de restricción de índice único.

Para crear un solucionador de conflictos personalizado basado en un procedimiento almacenado

  1. En el publicador, ya sea en la publicación o en la base de datos msdb , cree un nuevo procedimiento almacenado del sistema que implemente los parámetros necesarios siguientes:

    Parámetro Tipo de datos Descripción
    @tableowner sysname Nombre del propietario de la tabla en la que se resuelve un conflicto. Éste es el propietario de la tabla de la base de datos de publicación.
    @tablename sysname Nombre de la tabla en la que se resuelve un conflicto.
    @rowguid uniqueidentifier Identificador único de la fila que tiene el conflicto.
    @subscriber sysname Nombre del servidor desde donde se propaga un cambio conflictivo.
    @subscriber_db sysname Nombre de la base de datos desde donde se propaga un cambio conflictivo.
    @log_conflict OUTPUT int Establece si el proceso de mezcla debería registrar un conflicto para su posterior resolución:

    0 = No registre el conflicto.

    1 = El suscriptor es el perdedor del conflicto.

    2 = El publicador es el perdedor del conflicto.
    @conflict_message OUTPUT nvarchar(512) Mensaje que se va a proporcionar sobre la resolución si se registra el conflicto.
    @destowner sysname El propietario de la tabla publicada en el suscriptor.

    Este procedimiento almacenado utiliza los valores que pasa el Agente de mezcla a estos parámetros para implementar la lógica de resolución de conflictos personalizada. Debe devolver un conjunto de resultados de fila única que tenga una estructura idéntica a la tabla base y que contenga los valores de datos de la versión ganadora de la fila.

  2. Conceda permisos EXECUTE para el procedimiento almacenado a todos los inicios de sesión utilizados por los suscriptores para conectarse al publicador.

Uso de un solucionador de conflictos personalizado con un nuevo artículo de tabla

  1. Ejecute sp_addmergearticle para definir un artículo.

  2. Especifique un valor de MicrosoftSQLServer Stored Procedure Resolver para el parámetro @article_resolver.

  3. Especifique el nombre del procedimiento almacenado que implementa la lógica del solucionador de conflictos para el parámetro @resolver_info.

    Para más información, consulte Definir un artículo.

Para utilizar un solucionador de conflictos personalizado con un artículo de tabla existente

  1. Ejecute sp_changemergearticle, especificando @publication, @article, un valor de article_resolver para @property, y un valor de MicrosoftSQLServer Stored ProcedureResolver para @value.

  2. Ejecute sp_changemergearticle, especificando @publication, @article, el valor resolver_info para @propertyy el nombre del procedimiento almacenado que implementa la lógica de solucionador de conflictos para @value.

Uso un solucionador personalizado basado en COM

El espacio de nombres Microsoft.SqlServer.Replication.BusinessLogicSupport implementa una interfaz que le permite escribir una lógica de negocios compleja para administrar eventos y solucionar conflictos que se producen durante el proceso de sincronización de replicación de mezcla. Para más información, consulte Implementar un controlador de lógica de negocios para un artículo de mezcla. También puede escribir su propia lógica de negocios personalizada basada en código nativo para solucionar conflictos. Esta lógica está generada como componente COM y se compila en las bibliotecas de vínculo dinámico (DLL), usando productos como Microsoft Visual C++. Este tipo de solucionador de conflictos personalizado basado en COM debe implementar la interfaz ICustomResolver, que está diseñada específicamente para la resolución de conflictos.

Para crear y registrar un solucionador de conflictos personalizado basado en COM

  1. En un entorno de creación compatible con COM, agregue referencias a la biblioteca del solucionador de conflictos personalizado.

  2. Para un proyecto de Visual C++, use la directiva #import para importar esta biblioteca en su proyecto.

  3. Cree una clase que implemente la interfaz ICustomResolver .

  4. Implemente determinados métodos y propiedades.

  5. Genere el proyecto para crear el archivo de biblioteca del solucionador de conflictos personalizado.

  6. Implemente la biblioteca en el directorio que contiene la aplicación ejecutable del Agente de mezcla (normalmente \Microsoft SQL Server\100\COM).

    Nota:

    Se debe implementar un solucionador de conflictos personalizado en el Suscriptor para una suscripción de extracción, en el Distribuidor para una suscripción de inserción, o en el servidor web usado con sincronización web.

  7. Registre la biblioteca del solucionador de conflictos personalizado mediante la ejecución de regsvr32.exe desde el directorio de implementación de la siguiente manera:

    regsvr32.exe mycustomresolver.dll  
    
  8. En el Publicador, ejecute sp_enumcustomresolvers (Transact-SQL) para comprobar que la biblioteca no está registrada todavía como solucionador de conflictos personalizado.

  9. Para registrar la biblioteca como solucionador de conflictos personalizado, ejecute sp_registercustomresolver (Transact-SQL) en el Distribuidor. Especifique el nombre descriptivo del objeto COM para @article_resolver, el Id. de la biblioteca (CLSID) para @resolver_clsidy un valor de false para @is_dotnet_assembly.

    Nota:

    Cuando ya no se necesite, se puede eliminar del registro un solucionador de conflictos personalizado con sp_unregistercustomresolver (Transact-SQL).

  10. (Opcional) En un clúster, repita los pasos 6-9 para registrar el solucionador personalizado en todos los nodos del clúster. Estos pasos son necesarios para garantizar que el solucionador personalizado pueda cargar correctamente la conciliación tras una conmutación por error.

Para utilizar un solucionador de conflictos personalizado con un nuevo artículo de tabla

  1. En el Publicador, ejecute sp_enumcustomresolvers (Transact-SQL) y tenga en cuenta el nombre descriptivo del solucionador que desee.

  2. En la base de datos de publicación del publicador, ejecute sp_addmergearticle (Transact-SQL) para definir un artículo. Especifique el nombre descriptivo del solucionador de artículos del paso 1 para @article_resolver. Para más información, consulte Definir un artículo.

Para utilizar un solucionador de conflictos personalizado con un artículo de tabla existente

  1. En el Publicador, ejecute sp_enumcustomresolvers (Transact-SQL) y tenga en cuenta el nombre descriptivo del solucionador que desee.

  2. Ejecute sp_changemergearticle (Transact-SQL) especificando @publication, @article, un valor de article_resolver para @property y el nombre descriptivo del solucionador de artículos del paso 1 para @value.

Consulte también

Replicación de mezcla avanzada: detección y resolución de conflictos
Conflictos de replicación de mezcla avanzada: solucionadores personalizados basados en COM
Prácticas recomendadas de seguridad de replicación