Cómo especificar una resolución de artículos de la mezcla (programación de la replicación con Transact-SQL)

Al definir un artículo para una publicación de mezcla, puede especificar una resolución de conflicto personalizada. Para obtener más información, vea Detección y resolución de conflictos de replicación de mezcla avanzada. Microsoft SQL Server incluye varios solucionadores de conflictos personalizados predefinidos, o si lo prefiere puede escribir el suyo propio. Si necesita implementar lógica personalizada que se ejecute para cada fila replicada, no sólo para filas con conflictos, vea Cómo implementar un controlador de lógica de negocios para un artículo de mezcla (programación de la replicación).

Para registrar un solucionador de conflictos personalizado

  1. Si piensa registrar su propio solucionador de conflictos personalizado, cree uno de los tipos siguientes:

  2. Para determinar si el solucionador deseado ya está registrado, ejecute sp_enumcustomresolvers (Transact-SQL) en el publicador en cualquier base de datos. Esto muestra una descripción del solucionador personalizado así como del identificador de clase (CLSID) de cada solucionador estándar para COM registrado en el distribuidor o información sobre el ensamblado administrado de cada controlador de lógica de negocios registrado en el distribuidor.

  3. Si el solucionador personalizado aún no está registrado, ejecute sp_registercustomresolver (Transact-SQL) en el distribuidor. Especifique un nombre para el solucionador en @article_resolver; para un controlador de lógica de negocios, éste es el nombre descriptivo del ensamblado. Para los solucionadores estándar para COM, especifique el CLSID de la DLL para @ resolver_clsidy para un controlador de lógica de negocios, especifique el valor true para @is_dotnet_assembly, el nombre del ensamblado para @ dotnet_assembly_namey el nombre completo de la clase que invalida BusinessLogicModule para @dotnet_class_name.

    Nota

    Si no hay implementado un ensamblado de controlador de lógica de negocios en el mismo directorio que la aplicación ejecutable de Combinación Agente, en el mismo directorio que la aplicación que inicia el Agente de mezcla de forma sincrónica, o en la caché de ensamblados global (GAC), debe especificar la ruta de acceso completa con el nombre de ensamblado para @dotnet_assembly_name.

  4. Si el solucionador es un solucionador estándar para COM:

    • Copie la DLL de la resolución personalizada en el distribuidor para la suscripción de inserción o en el suscriptor para las suscripciones de extracción.

      Nota

      Los solucionadores personalizados de Microsoft se encuentran en el directorio C:\Archivos de programa\Microsoft SQL Server\100\COM.

    • Utilice regsvr32.exe para registrar la DLL del solucionador personalizado con el sistema operativo. Por ejemplo, al ejecutar lo siguiente desde el símbolo del sistema se registra el Solucionador de conflictos de Suma de SQL Server:

      regsvr32 ssradd.dll
      
  5. Si el solucionador es un controlador de lógica de negocios, implemente el ensamblado en la misma carpeta que la aplicación ejecutable del Agente de mezcla (replmerg.exe), en la misma carpeta que la aplicación que invoca el Agente de mezcla o en la carpeta especificada para el parámetro @dotnet_assembly_name del paso 3.

    Nota

    La ubicación de instalación predeterminada de la aplicación ejecutable de Agente de mezcla es C:\Archivos de programa\Microsoft SQL Server\100\COM.

Para especificar un solucionador personalizado al definir un artículo de mezcla

  1. Si tiene previsto utilizar un solucionador de conflictos personalizado, cree y registre un solucionador mediante el procedimiento anterior.

  2. En el publicador, ejecute sp_enumcustomresolvers (Transact-SQL) y tenga en cuenta el nombre del solucionador personalizado deseado en el campo Valor del conjunto de resultados.

  3. En la base de datos de publicación del publicador, ejecute sp_addmergearticle (Transact-SQL). Especifique el nombre de la resolución del paso 2 para @article_resolver y cualquier entrada necesaria para la resolución personalizada utilizando el parámetro @resolver_info. Para los solucionadores personalizados basados en un procedimiento almacenado, @ resolver_info es el nombre del procedimiento almacenado. Para obtener más información acerca de la entrada necesaria para los solucionadores personalizados de Microsoft, vea Resoluciones basadas en Microsoft COM.

Para especificar o cambiar un solucionador personalizado para un artículo de mezcla existente

  1. Para determinar si se ha definido un solucionador personalizado para un artículo u obtener el nombre del solucionador, ejecute sp_helpmergearticle (Transact-SQL). Si hay un solucionador personalizado definido para el artículo, su nombre se mostrará en el campo article_resolver. Cualquier entrada proporcionada a la resolución se mostrará en el campo resolver_info del conjunto de resultados.

  2. En el publicador, ejecute sp_enumcustomresolvers (Transact-SQL) y tenga en cuenta el nombre del solucionador personalizado deseado en el campo Valor del conjunto de resultados.

  3. En la base de datos de publicación del publicador, ejecute sp_changemergearticle (Transact-SQL). Especifique el valor article_resolver, incluso la ruta de acceso completa para los controladores de lógica de negocios, para @propertyy el nombre del solucionador personalizado deseado del paso 2 para @value.

  4. Para cambiar alguna entrada necesaria para el solucionador personalizado, ejecute de nuevo sp_changemergearticle (Transact-SQL). Especifique el valor resolver_info para @property y cualquier entrada necesaria para la resolución personalizada para @value. Para los solucionadores personalizados basados en un procedimiento almacenado, @ resolver_info es el nombre del procedimiento almacenado. Para obtener más información acerca de la entrada necesaria, vea Resoluciones basadas en Microsoft COM.

Para eliminar del registro un solucionador de conflictos personalizado

  1. En el publicador, ejecute sp_enumcustomresolvers (Transact-SQL) y tenga en cuenta el nombre del solucionador personalizado que quiere quitar en el campo Valor del conjunto de resultados.

  2. Ejecute sp_unregistercustomresolver (Transact-SQL) en el distribuidor. Especifique el nombre completo del solucionador personalizado del paso 1 para @ article_resolver.

Ejemplo

Este ejemplo crea un nuevo artículo y especifica que se utilice el Solucionador de conflictos de Cálculo de media de SQL Server para calcular la media de la columna UnitPrice cuando se produzcan conflictos.

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_addmergearticle 
    @publication = @publication, 
    @article = @article, 
    @source_object = @article, 
    @article_resolver = 'Microsoft SQL Server Averaging Conflict Resolver', 
    @resolver_info = 'UnitPrice';
GO

Este ejemplo cambia un artículo para especificar que se use el Solucionador de conflictos de Suma de SQL Server para calcular la suma de la columna UnitsOnOrder cuando se produzcan conflictos.

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='article_resolver', 
    @value='Microsoft SQL Server Additive Conflict Resolver';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='resolver_info', 
    @value='UnitsOnOrder';
GO