En este post voy a explicar como implementar una funcion de azure a modo de trigger para conectar una base de datos CosmosDb con otra base de datos SQL Server.

A partir de aquí me referire a cualquier base de datos como BBDD para abreviar.

El objetivo de este post es hacer una BBDD en CosmosDb con un trigger que reinserte los datos de personas que metamos en nuestra BBDD Sql Server.

Que vamos a utilizar

  • Necesitamos como prerrequisito una BBDD SQL Server en Azure
  • Tambien necesitamos tener un grupo de recursos y una cuenta de storage en azure
  • Una BBDD CosmosDb en Azure
  • Una Function App que funcionara como trigger de la BBDD de CosmosDb

!Empezemos¡, CosmosDb

Lo primero que haremos será crear BBDD CosmosDb desde nuestro portal de Azure, así que dirijamonos al portal y creemos un nuevo recurso.

cosmosdbSelection
cosmosdbCreation1

Estas son mis opciones para crear la BBDD Cosmos

  • Suscripción de Azure para estudiantes
  • Mi grupo de recursos es «Recursos Tajamar»
  • La BBDD se llamará «postazurefunctions» todo en minúscula
  • En api, elegiremos CORE (SQL)
  • La region al Oeste de Europa

Le daremos a revisar y crear, y cuando compruebe que todo esta correcto clickaremos en la opcion de Crear

cosmosdbCreation2

Ahora la Function App

Vamos a crear una nueva Function App para almacenar aqui nuestro trigger.

Nuevamente, desde el portal de azure creamos un nuevo recurso.

functionAppSelection
functionCreation1

Y la crearemos con estas opciones:

  • Nombre «posttrigger».
  • Suscripción Azure para estudiantes.
  • Grupo de recursos existente «RecursosTajamar»b
  • OS: Windows.
  • Plan de consumo, de esta forma azure solo nos cobrará por las peticiones realizadas a la funcion.
  • Ubicación Oeste de Europa.
  • Pila de ejecución .NET.
  • Storage existente «storagetajamarasr» en mi caso.
  • Y yo, personalmente, he desabilitado el application insights que viene por defecto.

Tras crear la function app, seleccionamos la opcion «En el portal» para escoger un entorno de desarrollo.

functionCreation3

Escogemos la opción Más plantillas, y escogemos Azure Cosmos DB Trigger

functionCreation4
functionCreation5

Y por ultimo nos va a pedir que instalemos la extensión de Microsoft.Azure.WebJobs.Extensions.CosmosDb.

Ahora nos podemos ir a estirar las piernas o a tomarnos un café, porque va a tardar un rato en instalar la extensión.

Creando el Trigger

functionCreation8

Esta es una forma en la que podemos crear nuestro trigger:

  • Nombre: CosmosPostTrigger
  • Colección: People
  • BBDD: People_DDBB
  • Nombre de la colección de concesiones PeopleCollection
  • Y para la conexion de la cuenta, eleccionarenos «nuevo» y escogeremos la BBDD que hemos creado con anterioridad
functionCreation7

Y como resultado, si accedemos a nuestra BBDD Cosmos, veremos que se ha añadido de forma automática una nueva coleccion en el explorador de datos.

Colecciones

Aprovechando que estamos en la BBDD de Cosmos, vamos a crear una nueva coleccion.

En esta coleccion será donde insertaremos la información de la BBDD.

Y la podemos crear así:

functionCreation10

!Importante¡ la información de esta colección debe coincidir con la que hemos puesto en el trigger.

  • Database id existente: People_DDBB
  • Collection id: People
  • Partition key: /people. Importante que sea en minúscula

EN SQL Server

Necesitamos una tabla espejo para almacenar los datos e personas, así que en nuestra BBDD SQL en azure nos crearemos una tabla «PERSON» con estos campos:

CREATE TABLE PERSON
(
	id NVARCHAR(50),
	PNAME NVARCHAR(50),
	PLASTNAME NVARCHAR(50),
	AGE INT
)

Y finalmente, configuremos nuestro trigger

Si queremos alcanzar nuestro objetivo necesitamos dos cosas:

  • Código en nuestra función para que inserte registros en SQL Server.
  • Las dependencias para utilizar este código.

Para añadir las dependencias que necesitamos a nuestra función necesitamos crear un archivo project.json

functionConfig4

E introduciremos dentro este codigo para tener nuestras dependencias insertadas.

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "System.Data.SqlClient":"4.6.0",
        "Newtonsoft.Json":"12.0.1"
      }
    }
   }
}

Y finalmente en el archivo run.csxintroducimos el código que hace funcionar a nuestro trigger

#r "Microsoft.Azure.DocumentDB.Core"
#r "System.Data.SqlClient"
#r "Newtonsoft.Json"
using System;
using System.Collections.Generic;
using Microsoft.Azure.Documents;
using System.Data.SqlClient;
using Newtonsoft.Json;
 
public static void Run(IReadOnlyList<Document> input, ILogger log)
{    
    if (input != null && input.Count > 0)
    {
        var data = JsonConvert.SerializeObject(input);
        log.LogInformation("New person: " + data);
        List<Person> people = 
        JsonConvert.DeserializeObject<List<Person>>(data);
        log.LogInformation("Person added: " + people[0].PNAME + " " + people[0].PLASTNAME);
        String response = InsertPersonSQL(people[0]);
        log.LogInformation(response);
        log.LogInformation("Documents modified " + input.Count);
        log.LogInformation("First document Id " + input[0].Id);
    }
}
public static string InsertPersonSQL(Person p)
{
    String cnnString  = "[******TU CADENA DE CONEXION******]";
        
    using (SqlConnection cn = new SqlConnection(cnnString))
    {
        cn.Open();
 
        String sql = "INSERT INTO PERSON VALUES ('" +  
        p.id + "','" +
        p.PNAME + "','" +
        p.PLASTNAME + "'," +
        p.AGE +")";
                   
        using (SqlCommand com = new SqlCommand(sql, cn))
        {
            int affected = com.ExecuteNonQuery();
            return "Affected registers: " + affected;
        }
    }
}

public class Person{
    public String id {get;set;}
    public String PNAME {get;set;}
    public String PLASTNAME {get;set;}
    public int AGE {get;set;}
}

Que hace nuestro código

Tenemos una clase Person con las propierdades que deseamos almacenar

Un método InsertPersonSql que inserta a las personas en la BBDD SQL Server

Y el método Run que se ejecuta al ser llamado el trigger, serializa en forma de json la información, convierte esta información en una lista de personas y llama a la funcion para insertar a la persona en la BBDD.

Ademas ejecuta varias tareas de loggin para apreciar el resultado de la operación.

Ahora, probemos que funciona

Abramos nuestra BBDD CosmosDb en otra pestaña mientras tenemos la del trigger abierta para ver los resultados.

Vamos a crear un nuevo documento en la colección People. Insertaremos este nuevo documento:

{
    "id": "1",
    "PNAME": "ANDRES",
    "PLASTNAME": "SANCHEZ",
    "AGE": 23
}

Y ahora podemos observar que el trigger se ha activado

functionResult2

Y que en nuestra tabla de SQL Server tenemos un nuevo registro

functionResult3

Autor: Andrés Sánchez Robleño

Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin

Centro: Tajamar

Año académico: 2018-2019

LinkedIn: https://es.linkedin.com/in/andrés-sánchez-robleño-7a5863162

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.