1. Tema
1.1 Introducción
Debido al éxito de nuestro primer artículo técnico que se puede encontrar aquí decidimos continuar. Esta vez veremos cómo se puede lograr una integración entre el Exchange y Salesforce de la forma más sencilla. Utilizaremos consultas SQL.
Para la integración utilizamos CB Linked Server para aplicaciones empresariales. Pídanos una prueba gratuita del producto.
2. 2. Requisitos de los escenarios
El escenario de integración que se requiere aquí es sincronizar entre una tabla de contactos de la base de datos local, Exchange 365 contactos y contactos de la Fuerza de Ventas y tener una réplica inmediata de la tabla de la base de datos local a esos 2 sistemas de destino. Esto podría ser útil para tener una copia de seguridad de los contactos fuera de línea o para crear un almacén de datos o por otras razones.
3. Flujo de trabajo básico
3.1 Configurar el Analizador de Consultas CB
El primer paso, es asegurarse de que eres capaz de conectarte al sistema objetivo (Exchange y SalesForce en nuestro escenario); la forma más fácil de hacerlo es a través de CB Query Analyzer. Aquí ya he configurado mi servidor ConnectBridge a través de la herramienta de Administración para conectar con el MS Exchange 365 y con SalesForce creando los grupos y usuarios necesarios. He creado un nombre de usuario llamado "martin" con contraseña "1234”. Este usuario tiene derechos para conectarse a Exchange 365 y SalesForce. Ahora desde el Query Analyzer crearé 2 conexiones a cada sistema de destino y me aseguraré de que pueda conectarse con éxito.
Figura 1: Administración de cuentas
Figura 2: Administración de grupos y usuarios
Figura 3: Conexiones del analizador de consultas
3.2 Pruebe sus declaraciones
Como se muestra arriba, tenemos una configuración y conexión exitosa a ambos sistemas de objetivos. Ahora podemos probar nuestras declaraciones
3.2.1 Contactos de Exchange
En mi cuenta Exchange, tengo 3 contactos como se muestra a continuación
Figura 4: Contactos de Exchange
Ahora vamos a probar las 4 operaciones básicas SELECCIONAR, INSERTAR, ACTUALIZAR y BORRAR
1. Seleccionar los contactos
La ejecución de la siguiente declaración debería darnos los 3 contactos que se muestran en la figura 5.
SELECCIONE [Nombre], [Apellido], [Email1Dirección de correo electrónico] DE [Contacto];
Figura 5: Selección de contactos
2. Insertar un contacto
Al ejecutar la siguiente declaración se debe insertar un nuevo contacto que se muestra en la Figura 6
INSERT INTO Contact([GivenName],[SurName],[Email1EmailAddress]) VALUES ('Peter','K.', 'peter@gmail.com');
Figura 6: Insertar un nuevo contacto
3. Actualizar un contacto
La ejecución de la siguiente declaración debe actualizar el apellido del contacto que insertamos anteriormente como se muestra en la figura 7
UPDATE Contact SET [SurName] = 'Keys' WHERE [Email1EmailAddress] LIKE 'peter@gmail.com';
Figura 7: Contacto de actualización
4. Borrar un contacto
Al ejecutar la siguiente declaración se debe eliminar el contacto recién insertado, como se muestra en la figura 8
DELETE FROM Contact WHERE [Email1EmailAddress] LIKE 'peter@gmail.com';
Figura 8: Borrar el contacto
3.2.2 Contactos de la fuerza de ventas
En mi cuenta de SalesForce, tengo 17 contactos como se muestra a continuación
Figura 9: Contactos de la Fuerza de Ventas
Ahora vamos a probar las mismas 4 operaciones básicas: SELECCIONAR, INSERTAR, ACTUALIZAR y BORRAR.
1. Seleccionar los contactos
La ejecución de la siguiente declaración debería darnos los 17 contactos que se muestran en la figura 10.
SELECCIONE [Nombre], [Apellido], [Email] DE [Contacto];
Figura 10: Selección de contactos
2. Insertar un contacto
Al ejecutar la siguiente declaración se debe insertar un nuevo contacto que se muestra en la figura 11
INSERT INTO Contact([Firstname],[LastName],[Email]) VALUES ('Peter','K.', 'peter@gmail.com');
Figura 11: Insertar un nuevo contacto
3. Actualizar un contacto
La ejecución de la siguiente declaración debe actualizar el apellido del contacto que insertamos anteriormente como se muestra en la figura 12
UPDATE Contact SET [LastName] = 'Keys' WHERE [Email] = 'peter@gmail.com';
Figura 12: Contacto de actualización
4. Borrar un contacto
Al ejecutar la siguiente declaración se debe eliminar el contacto recién insertado, como se muestra en la figura 13
DELETE FROM Contacto WHERE [Email] = 'peter@gmail.com';
Figura 13: Borrar el contacto
3.3 Copiar la conexión y las declaraciones
Ahora sabemos que podemos seleccionar, actualizar, insertar y borrar contactos de Exchange y SalesForce. Lo que necesitamos hacer ahora es copiar la cadena de conexión del Analizador de Consultas y nuestras sentencias probadas para usarlas más tarde en nuestra solución de MS SQL Server.
Para copiar la conexión del analizador de consultas, sólo tenemos que hacer clic con el botón derecho del ratón en la conexión, hacer clic en Editar e ir a la pestaña Avanzado y copiar el texto desde allí como se muestra a continuación en la Figura 14.
Figura 14: Copia de la cadena de conexión del Analizador de Consultas
Aquí están mis cadenas de conexión para ambos sistemas de objetivos.
Exchange
Driver={Media Gateway ODBC Driver};impl='CORBA';host='localhost';port='8087';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234'
SalesForce
Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_SALF_CBD';UID='martin';PWD='1234'
Ahora estamos listos para abrir MS SQL Server y empezar a implementar nuestra solución de integración de SQL Server.
4. 4. Recorrido de la solución
4.1 MS SQL Server
Para poder trabajar con fuentes de datos externas a través de la función SQL Server Linked Server, necesitamos hacer las siguientes configuraciones
1. Inicie Microsoft SQL Server Management Studio e inicie sesión usando la autenticación de Windows o el nombre de usuario y la contraseña como se muestra a continuación en la Figura 15
Figura 15: Pantalla de inicio de sesión de MS SQL Server Management Studio
Figura 16: Propiedades de MSDASQL
2. Navegue hasta Objetos de servidor -> Servidores enlazados -> Proveedores -> MSDASQL expandiendo los nodos correspondientes, como se muestra en la figura 16. Haga clic con el botón derecho del ratón en MSDASQL - Microsoft Data Access SQL - y seleccione Propiedades para mostrar el diálogo de la figura 17
Figura 17: Configuración de las propiedades de MSDASQL
3. Tenemos que asegurarnos de que se comprueben los siguientes ajustes/opciones:
a. Sólo el nivel cero: Por razones de seguridad tenemos que asegurarnos de que sólo los proveedores de OLE DB que cumplen con el nivel 0 de la interfaz OLE DB son compatibles.
b. Permitir el procesopara permitir que el/los proveedor/es de datos - "fuentes de datos externas" - se instancien como un servidor en proceso - "en el mismo proceso que MS SQL Server". Necesitamos hacer esto para evitar pasar información de autenticación entre MS SQL Server y el Proveedor y para poder trabajar con tipos de datos como (varchar(max), nvarchar(max), varbinary(max), text, ntext, o image). Si no activamos esta opción, no podremos obtener un dato de tipo imagen de Exchange - por ejemplo - e insertarlo en nuestra Base de Datos MS SQL Server.
4. Ahora tenemos que habilitar el MS SQL Server para conectar con los proveedores externos y ejecutar consultas para consultar los datos de los proveedores externos que utilizan OLEDB - llamémoslos "Fuentes de datos externos de la OLEDB”. Lo haremos en tres pasos:
a. Necesitamos abrir una nueva ventana de consulta haciendo clic en el botón Nueva consulta como se muestra en la figura 18 a continuación. No importa qué base de datos esté activa, porque lo que vamos a hacer va a afectar a toda la instalación de MS SQL Server y a su vez a todas y cada una de las bases de datos que hay. Como se muestra a continuación tengo "master" como la base de datos activa/destinada
Figura 18: Analizador de consultas de MS SQL Server
b. Necesitamos reconfigurar MS SQL Server para poder cambiar/configurar sus opciones avanzadas. Para ello vamos a ejecutar un procedimiento almacenado llamado "sp_configure" - es un procedimiento almacenado del sistema preinstalado - y vamos a específicamente "mostrar opciones avanzadas" - poniendo esta opción a 1. Para ello escribimos "exec sp_configure 'show advanced options', 1; reconfigure" y pulsamos F5 para ejecutar. Si todo va bien, deberías obtener un mensaje similar al de la Figura 19 a continuación
Figura 19: MS SQL Server - Mostrar opciones avanzadas
c. Ahora tenemos que permitir que MS SQL Server consulte esos "Fuentes de datos externos de la OLEDB" usando algo llamado "Consultas distribuidas ad hoc". Por defecto, MS SQL Server no permite las "Ad Hoc Distributed Queries" por lo tanto necesitamos reconfigurar esta opción avanzada - por eso hicimos el paso anterior - ejecutando el procedimiento almacenado "sp_configure" pasando el parámetro "Ad Hoc Distributed Queries" y el valor 1 para habilitarlo. Si todo va bien, deberías obtener un mensaje similar al de la Figura 20 siguiente tras ejecutar "exec sp_configure 'Ad Hoc Distributed Queries', 1; reconfigure"
Figura 20: MS SQL Server - Activación de consultas distribuidas ad hoc
Ahora podemos añadir tantos Linked Server como queramos, ya que nuestro MS SQL Server está configurado adecuadamente para permitirlo.
4.2 Configuración del servidor de enlace de MS Exchange
1. Navegue hasta Objetos de separación -> Servidores enlazados. Haga clic con el botón derecho del ratón en Servidores enlazados y elegir Nuevo Servidor Vinculado como se muestra en la figura 21 a continuación
Figura 21: MS SQL Server - Añadir nuevo servidor vinculado
2. En el nuevo diálogo de Servidor Vinculado, como se muestra en la Figura 22 a continuación, es necesario proporcionar lo siguiente:
a. Nombre del servidor vinculadopodría ser cualquier nombre válido, elijo Exchange365_CU7.
b. Proveedordebe ser "Proveedores de Microsoft OLE DB para controladores ODBC", ya que ConnectBridge está usando ODBC.
c. Cadena de proveedoresAquí pegamos la cadena de conexión que copiamos antes del Analizador de Consultas.
Figura 22: MS SQL Server - Configuración del nuevo servidor vinculado - General
3.Ahora necesitamos establecer una relación entre el usuario que usa/accede a MS SQL Server y el usuario que usa/accede a CB. El usuario que usa MS SQL Server se llama Local Login (en nuestro escenario es "sa") y el usuario que usa/accede al CB se llama Remote User (en nuestro escenario es Martin con login martin). Esto es lo que tenemos que configurar, y para ello hacemos clic en "seguridad"para mostrar el diálogo en la Figura 23 abajo
Figura 23: MS SQL Server - Configuración de un nuevo servidor vinculado - Seguridad
4. Cuando se muestra el diálogo anterior, hacemos clic en el botón Agregar y escribimos el Login Local y el Usuario Remoto como acordamos. Eso es lo que hice aquí en la Figura 24
Figura 24: MS SQL Server - Configuración de un nuevo servidor vinculado - Inicio de sesión
5. Vale, sé que quieres cerrar el diálogo pero ¡espera! tenemos que dar un paso más. Ahora tenemos que ir a "Opciones del servidor"en el lado izquierdo para mostrar el diálogo de la Figura 25 y habilitar 2 características
a. RPCpara habilitar una cierta característica de seguridad que necesitaríamos cuando usamos alguna característica de legado llamada Servidor remoto - no te preocupes por eso ahora - para que la validación de acceso entre CB y MS SQL Server sea posible
b. RPC Fuerapara permitir "Llamada de procedimiento a distancia"ya que necesitamos permitir que nuestros procedimientos almacenados puedan ejecutarse remotamente...
Figura 25: MS SQL Server - Configuración de un nuevo servidor vinculado - Opciones de servidor
6. Ahora hacemos clic en "OK" y ya está! ¡Sí! Configuramos el MS SQL Server para que se conecte a Exchange. Ahora podemos ver la plataforma Exchange como una base de datos en MS SQL Server, podemos ver la tabla llamada Contactos, podemos mostrar una lista de contactos de Exchange, todo esto, sin acceder a la base de datos de Exchange como se puede ver en la Figura 26 abajo
Figura 26: MS SQL Server - Servidor enlazado configurado correctamente
4.3 Probando el Servidor de Enlace MS Exchange
Antes de desarrollar nuestra solución de integración, necesitamos estar seguros de que somos capaces de realizar la manipulación de los datos básicos en el MS Exchange a través de nuestro recién configurado Linked Server.
1. Seleccionar los contactos
La ejecución de la siguiente declaración debería darnos los 3 contactos del MS Exchange.
SELECCIONE Nombre, Apellido, Email1Dirección de correo electrónico de INTERCAMBIO365_CU7...Contacto;
¿Por qué el "..."? Porque sigue la sintaxis SERVIDOR.BASE DE DATOS.ESQUEMA.TABLA y como pueden ver en la Figura 26, nuestro Servidor es Exchange365_CU7, nuestra base de datos es "sin nombre" nuestro esquema es "sin nombre" y finalmente nuestra tabla es Contactos.
Figura 27: Selección de contactos
2. Insertar un contacto
La ejecución de la siguiente declaración debería insertar un nuevo contacto.
EXEC ('INSERT INTO Contacto([Nombre], [NombreSur], [DirecciónEmail1]) VALUES ("Peter", "K.", "peter@gmail.com");') AT EXCHANGE365_CU7;
Figura 28: Insertar un nuevo contacto
3. Actualizar un contacto
La ejecución de la siguiente declaración debería actualizar el apellido del contacto que insertamos anteriormente
EXEC('UPDATE Contact SET [SurName] = "Keys" WHERE [Email1EmailAddress] LIKE "peter@gmail.com";') EN EXCHANGE365_CU7;
Figura 29: Contacto de actualización
4. Borrar un contacto
La ejecución de la siguiente declaración debería eliminar el contacto recién insertado
EXEC ('DELETE FROM Contact WHERE [Email1EmailAddress] LIKE "peter@gmail.com";') EN EXCHANGE365_CU7;
Figura 30: Borrar el contacto
4.4 Configurar el servidor vinculado a SalesForce
Vamos a seguir los pasos de la sección "4.2 Configurar el Servidor de Enlace MS Exchange" excepto, por supuesto, que vamos a utilizar la Cadena de Conexión para SalesForce. Después de seguir esos pasos, su Servidor Vinculado debe ser configurado exitosamente como se muestra a continuación.
Figura 31: Servidor vinculado a SalesForce configurado con éxito
4.5 Prueba del servidor de enlace de Salesforce
Como hicimos antes también con el MS Exchange Linked Server, necesitamos asegurarnos de que somos capaces de realizar las tareas básicas de manipulación de datos a través del SalesForce Linked Server.
Para abreviar la guía, la figura 32 a continuación está probando todas las siguientes afirmaciones
1. Seleccionar los contactos
La ejecución de la siguiente declaración debería darnos los contactos de SalesForce.
SELECCIONE Nombre, Apellido, Email1Dirección de correo electrónico de INTERCAMBIO365_CU7...Contacto;
2. Insertar un contacto
La ejecución de la siguiente declaración debería insertar un nuevo contacto.
EXEC ('INSERT INTO Contacto([Nombre], [NombreSur], [DirecciónEmail1]) VALUES ("Peter", "K.", "peter@gmail.com");') AT EXCHANGE365_CU7;
3. Actualizar un contacto
La ejecución de la siguiente declaración debería actualizar el apellido del contacto que insertamos anteriormente
EXEC('UPDATE Contact SET [SurName] = "Keys" WHERE [Email1EmailAddress] LIKE "peter@gmail.com";') EN EXCHANGE365_CU7;
4. Borrar un contacto
La ejecución de la siguiente declaración debería eliminar el contacto recién insertado
EXEC ('DELETE FROM Contact WHERE [Email1EmailAddress] LIKE "peter@gmail.com";') EN EXCHANGE365_CU7;
Figura 32: Probando el Servidor Vinculado de SalesForce
4.6 Cuadro de la base de datos local
A partir de aquí, necesitamos tener una base de datos local real en nuestro servidor local MS SQL. Si ya tienes una, entonces podrías usarla, de lo contrario necesitamos crear una nueva base de datos. He creado una base de datos llamada ConnectingSoftware con una tabla llamada LocalContacts. En esa tabla sólo hay un registro como se muestra a continuación en la Figura 33.
Figura 33: Tabla de contactos locales
4.7 Desencadenante de la tabla de replicación
El primer paso de nuestra solución es replicar los cambios en nuestra tabla de la base de datos local tanto a SalesForce como a Exchange. Vamos a implementar esto a través de un activador de la tabla.
A continuación se muestra el Script SQL para el disparador:
CREAR DISPARO [dbo]. [trgSyncContacto] ON [dbo]. [Contactos Locales] DESPUÉS DE INSERTAR, ACTUALIZAR, BORRAR AS COMIENZA declarar @Operación varchar(50) declarar @Nombre nvarchar(max) declarar @Apellido nvarchar(max) declarar @Email varchar(255) declare @Deleted_FirstName nvarchar(max) declare @Deleted_LastName nvarchar(max) declare @Borrado_Correo electrónico varchar(255) SI COLUMNS_UPDATED() > 0 COMIENZA --si tenemos columnas actualizadas, entonces insertamos o borramos un registro SI EXISTE (SELECCIONE * DE BORRADO) COMIENZA --si hemos borrado los valores, entonces fue una operaci¢n de actualizaci¢n SELECCIONE @Nombre = insertado.Nombre, @Apellido = insertado.Apellido, @Email = insertado.Email, @Deleted_FirstName = borrado.FirstName, @Apellido_borrado = borrado.Apellido, @Correo_borrado = Borrado. Correo electrónico DE suprimido, insertado --Fuerza de ventas Exec ('ACTUALIZACIÓN Contacto SET Nombre = ?, Apellido = ?, Email = ? WHERE FirstName = ? y LastName = ? y Email = ?', @Nombre, @Apellido, @Correo electrónico, @Nombre_borrado, @Apellido_Borrado, @Correo_Borrado) en SALESFORCE_CBD; --Exchange EJECUTAR ('ACTUALIZAR CONTACTO SET Nombre = ?, Apellido = ?, Email1EmailAddress = ? Dónde Nombre = ? y Apellido = ? y Email1EmailAddress = ?', @Nombre, @Apellido, @Email, @Nombre_Borrado, @Apellido_Borrado, @Borrado_Correo electrónico) en EXCHANGE365_CU7; FIN ELSE COMIENZA --si no era una operación de actualización, entonces era una inserción SELECCIONE @Nombre = Nombre, @Apellido = Apellido, @Correo electrónico = Correo electrónico Desde la inserción... --Fuerza de ventas Exec ('Insertar en los valores de Contacto (Nombre, Apellido, Email) (?,?,?)', @Nombre, @Apellido, @Correo electrónico) en SALESFORCE_CBD; --MS Exchange EXEC ('Insertar en contacto (Nombre, apellido, Email1EmailAddress) values(?,?,?)', @Nombre, @Apellido, @Correo electrónico) en EXCHANGE365_CU7; FIN FIN ELSE COMIENZA --si la operaci¢n no era de actualizaci¢n/inserci¢n entonces era de borrado SELECT @Deleted_Email = Email FROM borrado --Fuerza de ventas Exec ('Delete From Contact Where Email = ?', @Deleted_Email) en SALESFORCE_CBD; --MS Exchange Exec ('Borrar del contacto donde Email1EmailAddress = ?', @Borrado_Email) en EXCHANGE365_CU7; FIN FIN
Advertencia: después de ejecutar el script anterior, no deberíamos insertar nada de la tabla de la base de datos local hasta que no nos sincronicemos entre nuestros 2 sistemas objetivo (Exchange y SalesForce) y nuestra base de datos local, de lo contrario podríamos terminar duplicando registros accidentalmente, ya que la lógica aquí no comprueba si ya existía un nuevo registro en esos sistemas objetivo.
4.8 Procedimiento de sincronización almacenada
El segundo paso de nuestra solución es sincronizar entre el MS Exchange, SalesForce y nuestra tabla de Contactos Locales, para que cada sistema tenga el mismo conjunto de contactos.
Para ello vamos a escribir un procedimiento almacenado. La lógica del procedimiento es..:
1. Es muy importante desactivar el disparador que creamos arriba "como estamos haciendo la sincronización, no debemos habilitar la replicación automática implementada por el disparador"
2. Sincronizar entre SalesForce y mi base de datos
Usar la dirección de correo electrónico del contacto como clave de coincidencia; ¿Hay un contacto en SalesForce y no en mi tabla de contactos locales?
a. Sí: Agregar contacto a mi tabla de contactos locales
b. No: Actualizar el nombre y apellido del contacto en mi tabla de contactos locales
3. Sincronizar entre el MS Exchange y mi base de datos
Usando la dirección de correo electrónico del contacto como clave de coincidencia; ¿Hay un contacto en el Exchange y no en mi tabla de Contactos Locales?
a. Sí: Agregar contacto a mi tabla de contactos locales
b. No: Actualizar el nombre y apellido del contacto en mi tabla de contactos locales
En este momento, mi tabla de contactos locales tiene todos los contactos de SalesForce y MS Exchange además de los registros que estaban originalmente en la tabla. Ahora necesitamos actualizar cada sistema de destino por los contactos del otro sistema de destino y la base de datos local
4. Actualizar los contactos en SalesForce (por los contactos de Exchange y mi mesa local)
Usar la dirección de correo electrónico del contacto como clave de coincidencia; ¿Existe un contacto en mi tabla de contactos locales y no en SalesForce?
a. Sí: Agregar contacto con SalesForce
b. No: Actualizar el nombre y apellido del contacto en SalesForce
5. Actualizar los contactos en Exchange (por los contactos de SalesForce y mi mesa local)
Usando la dirección de correo electrónico del contacto como clave de coincidencia; ¿Hay un contacto en mi tabla de Contactos Locales y no en Exchange?
a. Sí: Agregar contacto a MS Exchange
b. No: Actualizar el nombre y el apellido del contacto en Exchange
6. Ahora, podemos activar el disparador que desactivamos antes, así que la replicación automática vuelve a estar activada.
El siguiente script SQL implementará la lógica discutida anteriormente
CREAR PROCEDIMIENTO [dbo]. [uspInitSync] -- Añade los parámetros para el procedimiento almacenado aquí AS COMIENZA -- Se añadió SET NOCOUNT ON para evitar que los conjuntos de resultados extra de -- interfiriendo con las declaraciones de SELECT. PONER EN MARCHA NOCOUNT; -inhabilitar el disparador para que, al insertar desde SalesForce no terminemos en --añadiendo los contactos de nuevo a SalesForce DESACTIVAR EL DISPLAZADOR [trgSyncContact] EN CONTACTOS LOCALES; --...fusionar los registros de SalesForce con los de LocalDB... DECLARAR @Tabla de contactos importados (Nombre nvarchar(max), Apellido nvarchar(max), Email varchar(255)); --actualizar / insertar contactos en LocalDB usando SalesForce como fuente Fusión de contactos locales como objetivo UTILIZANDO (SELECCIONE Nombre, Apellido, Email de SalesForce_CBD...Contacto) Como fuente ON (objetivo.Email COMO fuente.Email) CUANDO SE EMPAREJAN ENTONCES ACTUALIZACIÓN SET Nombre = fuente. Nombre, apellido = Fuente. Apellido CUANDO NO COINCIDEN, ENTONCES INSERTAR (Nombre, Apellido, Email) VALORES (fuente.Nombre, fuente.Apellido, fuente.Correo electrónico) SALIDA insertada. Nombre, insertado. Apellido, insertado. Email INTO @ImportedContacts; --muestra los contactos insertados en LocalDB de SalesForce seleccione * de @ImportedContacts; --actualizar / insertar contactos en LocalDB usando Exchange como fuente Fusión de contactos locales como objetivo UTILIZANDO (SELECCIONE Nombre, Apellido, Email1Dirección de correo electrónico de INTERCAMBIO365_CU7...Contacto) COMO FUENTE ON (target.Email COMO fuente.Email1Dirección de correo electrónico) CUANDO SE EMPAREJAN ENTONCES ACTUALIZACIÓN SET Nombre = fuente. Nombre, Apellido = Fuente. Apellido. CUANDO NO COINCIDEN, ENTONCES INSERTAR (Nombre, Apellido, Email) VALORES (fuente. Nombre, fuente. Apellido, fuente.Email1Dirección de correo electrónico) SALIDA insertada. Nombre, insertado. Apellido, insertado. Email INTO @ImportedContacts; -Muestra los contactos insertados usando la variable de la mesa seleccione * de @ImportedContacts; --copia todo a SalesForce & Exchange para que tengan una copia exacta --de LocalDB después de que LocalDB esté sincronizado con todos los sistemas --Tengo que usar cursour y si, porque usando insert....select.... donde no --no funcionó con las mesas remotas y también la fusión no funciona con --a las mesas remotas Declarar @Nombre nvarchar(max) declarar @Apellido nvarchar(max) declarar @Email varchar(255) declarar @SQL nvarchar(max) DECLARAR LOS CONTACTOS_CURSOR CURSOR FAST_FORWARD PARA SELECCIONE Nombre, Apellido, Email de LocalContacts; Contactos ABIERTOS_cursor BUSCAR EL SIGUIENTE DE CONTACTOS_CURSOR EN @Nombre, @Apellido, @Correo electrónico MIENTRAS QUE @@FETCH_STATUS = 0 COMIENZA SI EXISTE (SELECCIONE CORREO ELECTRÓNICO 1Dirección de correo electrónico de la bolsa 365_CU7...Contacto DONDE Email1Dirección de correo electrónico COMO @Email) EJECUTAR ('ACTUALIZAR CONJUNTO DE CONTACTO Nombre = ?, Apellido = ? DÓNDE Email1EmailAddress = ?', @Nombre, @Apellido, @Email) en el Intercambio365_CU7; ELSE EXEC ('Insertar en contacto (Nombre, apellido, Email1EmailAddress) values(?,?,?)', @Nombre, @Apellido, @Correo electrónico) en EXCHANGE365_CU7; SI EXISTE (SELECCIONE EL CORREO ELECTRÓNICO DE SalesForce_CBD... Contacte DONDE QUIERA el correo electrónico @Email) Exec ('ACTUALIZACIÓN DE CONTACTO SET Nombre = ?, Apellido = ? DÓNDE Email = ?', @Nombre, @Apellido, @Email) en SalesForce_CBD; ELSE Exec ('Insertar en los valores de Contacto (Nombre, Apellido, Email) (?,?,?)', @Nombre, @Apellido, @Correo electrónico) en SalesForce_CBD; BUSCA EL SIGUIENTE DE CONTACTOS_CURSOR EN @Nombre, @Apellido, @Correo electrónico FIN Cerrar Contactos_cursor; DESALOJAR Contactos_cursor; --habilitar el disparador para que cualquier modificación se refleje en el LOB online Habilitar el disparador en los contactos locales; FIN
5. Solución en acción
Ahora el primer paso es ejecutar el procedimiento de sincronización almacenado "uspInitSync" como se muestra a continuación, el procedimiento almacenado se ejecutó sin errores.
Figura 34: Ejecutar el procedimiento de sincronización almacenada
También pudimos ver que se añadieron nuevos contactos a la MS Exchange
Figura 35: Actualizaciones de MS Exchange
Y se han añadido nuevos contactos a SalesForce
Figura 36: Actualizaciones de SalesForce
Y nuestra tabla de base de datos local ahora tiene nuevos contactos
Figura 37: Actualizaciones en la tabla de contactos locales
Podemos ver la replicación automática en acción también
1. Insertar el contacto de la base de datos local, borrarlo de SalesForce y Exchange
Figura 38: Insertar la réplica
2. La actualización del contacto en la base de datos local lo actualiza en SalesForce y Exchange
Figura 39: Actualización de la réplica
3. Borrar el contacto de la base de datos local, borrarlo de SalesForce y Exchange
Figura 40: Eliminar la replicación
6. Notas sobre la solución
Tratamos de mantener la lógica de la solución lo más simple posible, sin embargo la lógica podría ser mejorada y ajustada para un mejor rendimiento y características más complejas.
Puede encontrar más información sobre este producto en la página de productos de CB Linked Server for Enterprise Applications.