Integración SQL de Exchange y Salesforce

Peter Hanustiak Técnico Deje un comentario

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 Contact 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 instale(n) como un servidor en proceso - "en el mismo proceso que MS SQL Server". Necesitamos hacer eso 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), varbinario(max), texto, ntexto o imagen). Sin habilitar esta opción, no podremos obtener un dato de tipo imagen de Exchange - por ejemplo - e insertarlo en nuestra Base de Datos de 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 el 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 "mostrar opciones avanzadas" específicamente - estableciendo esta opción en 1. Para ello escribimos "exec sp_configure 'show advanced options', 1; reconfigure" y presionamos F5 para ejecutar. Si todo va bien, debería obtener un mensaje similar al de la Figura 19 de abajo

Figura 19: MS SQL Server - Mostrando 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ía obtenerse un mensaje similar al de la figura 20, después de ejecutar "exec sp_configure 'Ad Hoc Distributed Queries', 1; reconfigure".

Figura 20: MS SQL Server - Habilitació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ñadiendo un 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 - Logins

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 del 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 - Linked Server configurado con éxito

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 Contact([GivenName], [SurName], [Email1EmailAddress])
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";') AT 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";') AT 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 Contact([GivenName], [SurName], [Email1EmailAddress])
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";') AT 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";') AT 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:

CREATE TRIGGER [dbo].[trgSyncContact]
ON [dbo].[LocalContacts]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
declare @Operation varchar(50)
declare @FirstName nvarchar(max)
declare @LastName nvarchar(max)
declare @Email varchar(255)
declare @Deleted_FirstName nvarchar(max)
declare @Deleted_LastName nvarchar(max)
declare @Deleted_Email varchar(255)

IF COLUMNS_UPDATED() > 0
BEGIN
--if we have updated columns, then we either inserted or deleted a
record
IF EXISTS (SELECT * FROM DELETED)
BEGIN
--if we have deleted values, then it was an update operation
SELECT @FirstName = inserted.FirstName, @LastName =
inserted.LastName, @Email = inserted.Email,
@Deleted_FirstName = deleted.FirstName,
@Deleted_LastName = deleted.LastName, @Deleted_Email =
deleted.Email
FROM deleted, inserted
--SalesForce
Exec ('UPDATE Contact SET FirstName = ?, LastName = ?, Email = ?
WHERE FirstName = ? and LastName = ? and Email = ?',
@FirstName, @LastName, @Email, @Deleted_FirstName,
@Deleted_LastName, @Deleted_Email) at SALESFORCE_CBD;
--Exchange
EXEC ('UPDATE Contact SET GivenName = ?, SurName = ?,
Email1EmailAddress = ? WHERE GivenName = ? and SurName =
? and Email1EmailAddress = ?', @FirstName, @LastName,
@Email, @Deleted_FirstName, @Deleted_LastName,
@Deleted_Email) at EXCHANGE365_CU7;
END
ELSE
BEGIN
--if it wasn't update operation, then it was insert
SELECT @FirstName = FirstName, @LastName = LastName, @Email =
Email
FROM inserted
--SalesForce
Exec ('Insert into Contact (FirstName, LastName, Email) values
(?,?,?)', @FirstName, @LastName, @Email) at
SALESFORCE_CBD;
--MS Exchange
EXEC ('Insert into Contact (GivenName, SurName,
Email1EmailAddress) values(?,?,?)', @FirstName,
@LastName, @Email) at EXCHANGE365_CU7;
END
END
ELSE
BEGIN
--if the operation was not update/insert then it was delete
SELECT @Deleted_Email = Email FROM deleted
--SalesForce
Exec ('Delete From Contact Where Email = ?', @Deleted_Email) at
SALESFORCE_CBD;
--MS Exchange
Exec ('Delete From Contact Where Email1EmailAddress = ?',
@Deleted_Email) at EXCHANGE365_CU7;
END
END

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

CREATE PROCEDURE [dbo].[uspInitSync]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

--disable trigger so that, while inserting from SalesForce we don't endup in
--adding the contacts again to SalesForce
DISABLE TRIGGER [trgSyncContact] ON LocalContacts;

--merge records from SalesForce to LocalDB
DECLARE @ImportedContacts Table(FirstName nvarchar(max), LastName
nvarchar(max), Email varchar(255));

--update / insert contacts in LocalDB using SalesForce as source
MERGE LocalContacts AS target
USING (SELECT FirstName, LastName, Email FROM SalesForce_CBD...Contact)
AS source
ON (target.Email LIKE source.Email)
WHEN MATCHED THEN
UPDATE SET FirstName = source.FirstName, LastName =
source.LastName
WHEN NOT MATCHED THEN
INSERT (FirstName, LastName, Email)
VALUES (source.FirstName, source.LastName, source.Email)
OUTPUT inserted.FirstName, inserted.LastName, inserted.Email
INTO @ImportedContacts;

--show inserted contacts in LocalDB from SalesForce
select * from @ImportedContacts;

--update / insert contacts in LocalDB using Exchange as source
MERGE LocalContacts AS target
USING (SELECT GivenName, SurName, Email1EmailAddress FROM
EXCHANGE365_CU7...Contact) AS source
ON (target.Email LIKE source.Email1EmailAddress)
WHEN MATCHED THEN
UPDATE SET FirstName = source.GivenName, LastName =
source.SurName
WHEN NOT MATCHED THEN
INSERT (FirstName, LastName, Email)
VALUES (source.GivenName, source.SurName,
source.Email1EmailAddress)
OUTPUT inserted.FirstName, inserted.LastName, inserted.Email
INTO @ImportedContacts;

--display inserted contacts using table variable
select * from @ImportedContacts;

--now copy everything to SalesForce & Exchange so they will have exact copy
--from LocalDB after LocalDB is sync with all systems
--I have to use cursour and if because using insert....select....where not
--exists didn't work with remote tables and also merge doesn't work with
--remote tables
Declare @FirstName nvarchar(max)
declare @LastName nvarchar(max)
declare @Email varchar(255)
declare @SQL nvarchar(max)

DECLARE Contacts_cursor CURSOR FAST_FORWARD FOR
SELECT FirstName, LastName, Email from LocalContacts;

OPEN Contacts_cursor
FETCH NEXT FROM Contacts_cursor INTO @FirstName, @LastName, @Email
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT Email1EmailAddress FROM EXCHANGE365_CU7...Contact
WHERE Email1EmailAddress LIKE @Email)
EXEC ('UPDATE Contact SET GivenName = ?, SurName = ? WHERE
Email1EmailAddress = ?', @FirstName, @LastName, @Email)
at EXCHANGE365_CU7;
ELSE
EXEC ('Insert into Contact (GivenName, SurName,
Email1EmailAddress) values(?,?,?)', @FirstName,
@LastName, @Email) at EXCHANGE365_CU7;

IF EXISTS (SELECT Email FROM SalesForce_CBD...Contact WHERE Email LIKE
@Email)
Exec ('UPDATE Contact SET FirstName = ?, LastName = ? WHERE
Email = ?', @FirstName, @LastName, @Email) at
SalesForce_CBD;
ELSE
Exec ('Insert into Contact (FirstName, LastName, Email) values
(?,?,?)', @FirstName, @LastName, @Email) at
SalesForce_CBD;

FETCH NEXT FROM Contacts_cursor INTO @FirstName, @LastName, @Email
END
CLOSE Contacts_cursor;
DEALLOCATE Contacts_cursor;

--enable trigger so that any modification is reflected in online LOB
ENABLE TRIGGER [trgSyncContact] ON LocalContacts;
END

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 para Aplicaciones Empresariales.

Share this Post

Deja una respuesta