Compartir a través de


Implementar un solucionador de conflictos personalizado para un artículo de mezcla

En este tema se describe cómo implementar un solucionador de conflictos personalizado para un artículo de combinación en SQL Server 2014 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, se llama a este procedimiento almacenado cuando se encuentran conflictos en un artículo para el que se registró el solucionador y el Agente de mezcla pasa información sobre la fila del conflicto a los parámetros pertinentes del procedimiento. Los solucionadores de conflictos personalizados basados en el procedimiento almacenado siempre se crean en el publicador.

Nota:

Los solucionadores de procedimientos almacenados de Microsoft SQL Server solo se invocan para controlar conflictos basados en cambios de fila. No se pueden utilizar para solucionar otros tipos de conflictos como errores de inserción debidos a infracciones de CLAVE PRINCIPAL o a 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 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 su lógica de resolución de conflictos personalizada; debe devolver un conjunto de resultados de filas único que sea idéntico en estructura a la tabla base y 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.

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

  1. Ejecute sp_addmergearticle para definir un artículo, especificando un valor de MicrosoftSQL Server Stored Procedure Resolver para el parámetro @article_resolver y 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 Define an Article.

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

  1. Ejecuta sp_changemergearticle, especificando @publication, @article, el valor article_resolver para @property y el valor MicrosoftSQL Server 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.

Usar 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 se crea como un componente COM y se compila en bibliotecas de vínculos dinámicos (DLL), mediante productos como Microsoft Visual C++. Este 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 usando 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 aún no está registrada 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 identificador de la biblioteca (CLSID) para @resolver_clsid y un valor de false para @is_dotnet_assembly.

    Nota:

    Cuando ya no es necesario, se puede anular el registro de un solucionador de conflictos personalizado mediante sp_unregistercustomresolver (Transact-SQL).

  10. (Opcional) En un clúster, repita los pasos 5-8 para registrar el solucionador personalizado en todos los nodos del clúster. Esto es necesario para asegurar que el solucionador personalizado pueda cargar correctamente la reconciliació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 anote el nombre descriptivo del solucionador deseado.

  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 Define an Article.

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

  1. En el publicador, ejecute sp_enumcustomresolvers (Transact-SQL) y anote el nombre descriptivo del solucionador deseado.

  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.

Ver un solucionador personalizado de ejemplo

  1. Hay un ejemplo disponible en los archivos de ejemplo de SQL Server 2000. Descargue el sql2000samples.zip. Esto descarga 3 archivos que van a 6,9 MB.

  2. Extraiga los archivos del archivo comprimido .cab descargado.

  3. Ejecute setup.exe.

    Nota:

    Al elegir las opciones de instalación, solo es necesario instalar los ejemplos de Replicación . (La ruta de instalación predeterminada es C:\Archivos de programa (x86)\Microsoft SQL Server 2000 Samples\1033\)

  4. Vaya a la carpeta de instalación. (La carpeta predeterminada es C:\Archivos de programa (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe).

  5. Ejecute el programa unzip_sqlreplSP3.exe .

    Nota:

    El solucionador com de ejemplo se instalará de forma predeterminada en la carpeta C:\Archivos de programa (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres .

  6. En la carpeta subspres , busque todas las repeticiones de #include sqlres.h en todos los archivos de origen y reemplácelas con #import "replrec.dll" no_namespace, raw_interfaces_only.

Consulte también

Detección y resolución de conflictos de replicación de mezcla avanzada
COM-Based Custom Resolvers
Procedimientos recomendados de seguridad de replicación