¡Jueves y seguimos con SSIS! Después del post de la semana pasada en el que vimos cómo crear paquetes en SSIS, hoy vamos ver como orquestar esos paquetes de manera que se ejecuten en paralelo o en un orden concreto y cubrirnos las espaldas en caso de tener que hacer labor de investigación... ¿Qué significa? ¡Ahora lo vemos!

Si os acordáis, el escenario en el que terminamos la serie anterior fue con un paquete en el que cargábamos datos de la dimensión productos de la base de datos a nuestro DWH.

 
¿Pero qué pasa si tenemos varias dimensiones que cargar? ¿Cómo podemos determinar la secuencia correcta? Bien, pues para eso vamos hacer lo que se denomina la orquestación de paquetes. Para ello, generamos un nuevo paquete SSIS: 

 
Al nuevo paquete creado, vamos a denominarlo Secuenciador_DWH:

Y arrastramos al diseñador la tarea denominada “Tarea Ejecutar Paquete”:

Una vez que la tenemos en el diseñador, accedemos a ella con doble click para configurarla y en la pantalla que se nos abre, procedemos a cambiarle el nombre y le introducimos una descripción, acordaros que es una muy buena práctica documentar todo, para que nuestros futuros yoes no se acuerden de nosotros cuando tengan que modificar un proyecto J:

En la pestaña Paquete, modificamos el “PackageNameFromProjectReference” por nuestro paquete de Carga_Dim_Producto:

 

Pulsamos en Aceptar, guardamos el proyecto y lo ejecutamos. Como resultado deberíamos obtener la siguiente secuencia:

 
 
¿Qué es lo que ha pasado? Qué hemos cargado a la tabla del DWH Dimension.Producto la tabla procedente de la base de datos. Y ahora llega el momento en el que os estáis preguntando… Javi, ¿qué hay de diferente con el post de la semana pasada? En un principio el resultado es el mismo cómo podemos ver en la base de datos:
 
 

La diferencia es un pequeño pero importante matiz… la tarea “Tarea Ejecutar Paquete” nos ha permitido llamar otro paquete, lo que nos abre la puerta de ejecutar paquetes simultáneos o en paralelo. ¿Cómo? Vamos a verlo:

Creamos en el DWH la tabla Dimension.Subcategory, y creamos un nuevo paquete replicando el mismo proceso de carga que en el creado para Dimension.Producto. Como resultado deberíamos obtener lo siguiente:

 

Ahora debemos de añadir la llamada al paquete Cargar_Dim_Subcategoria, ¿cómo lo podemos hacer? ¿Abrimos la “Tarea Ejecutar Paquete y añadimos una segunda tarea? … La respuesta es … No. ¿Y cómo lo hacemos? De la misma manera que hicimos en el post anterior con el contenedor de secuencias. Para ello, arrastramos al diseñador una segunda “Tarea Ejecutar Paquete”:

 
 

Y la configuramos de la misma manera que la anterior, pero llamando al paquete Carga_Dim_Subcategoria, y una vez hecho, arrastramos al diseñador un contenedor de secuencias como hemos dicho y las arrastramos dentro de él y debemos de obtener lo siguiente:

 
 

Pregunta para bingo como se suele decir, ¿Cuál es la secuencia de carga? ¿Qué dimensión me va a carga primero? ¿Producto? ¿Subcategoría?.... La respuesta es…. rebobles de tambores…. Ninguna. No están unidas por lo que las va a cargar de manera simultánea J Os he engañado con la forma de colocar las tareas. Si las conectásemos entre sí, las cargaría de manera escalonada:

¿Veis la diferencia? Hasta aquí todo correcto ¿sí? Pero puede darse el caso, de que no todo se ejecute de manera correcta y necesitemos saber qué es lo que ha pasado o cuándo se han ejecutado o no los paquetes. Y para ello, podemos introducir tanto al orquestador como a los paquetes, unas tareas para auditar de manera que tengamos un registro de la ejecución de los mismos. ¿Y cómo lo hacemos? Lo primero que tenemos que hacer es crear la tabla en el DWH donde vayamos a registrar los datos que queremos guardar, para ello, vamos a SSMS y creamos una tabla a la que llamamos tabla_auditoria con la siguiente estructura de columnas:

Nota: comentar que esta estructura es completamente adaptable a las necesidades de cada usuario y requerimiento de negocio.

 

Una vez que hemos creado la tabla donde vamos a registrar la información, volvemos a Visual Studio y abrimos el paquete Secuenciador_DWH. Pulsamos sobre el lienzo del diseñador, y a continuación sobre el panel de propiedades del mismo, buscamos la propiedad Name y le cambiamos el nombre a “Secuenciador_DWH” y pulsamos Enter.

 
 

A continuación, agregamos al lienzo del diseñador la tarea “Tarea Ejecutar SQL”:

 

Ahora pasamos a configurarla, para ello hacemos doble click sobre la tarea y como siempre... ¿Qué hacemos lo primero?... Asignarle un nombre, para este caso le vamos a llamar Iniciar Registro Auditoria de manera que lo visualicemos de la siguiente manera:

 

Ahora debemos configurar el tipo de conexión que queremos que use, en este caso queremos la conexión “Conexión_DWH”:

 

El siguiente paso que tenemos que dar, es la configuración del bloque “Instrucción SQL” y escribimos la siguiente sentencia:

 
 

Con la sentencia anterior, le estamos indicando que nos haga un INSERT en la tabla tabla_auditoria y nos rellene todos los campos a excepción de FechaFin y Estado que son NULL y los campos UsuariCarga y NombrePaquete que les pasamos una ?. ¿Y qué es la interrogación? Son los parámetros de sistema que queremos capturar, para eso aceptamos la sentencia SQL y vamos a la pestaña “Asignación de Parámetros” y añadimos 2 parámetros que son:

Parámetro 1: System::UserName

Parámetro 2: System::PackageName

Tipo de datos: NVARCHAR

Nombre de parámetro:

@username

@Packagename

Con el primer parámetro rescatamos el nombre del usuario que ha ejecutado el paquete y con el segundo el nombre del paquete que se ha ejecutado. Deberíamos obtener la siguiente pantalla:



Una vez completados los pasos anteriores, aceptamos y unimos la tarea que acabamos de crear con el contenedor de secuencias y obtenemos lo siguiente:

 

Antes de continuar, procedemos a crear la tarea “Iniciar Registro Auditoria” en los paquetes de Producto y SubcategoriaProducto, adaptando la consulta SQL a cada paquete.

SQL Producto:

 

SQL SubcategoriaProducto:

 

Una vez completados, lo ejecutamos el paquete Secuenciador_DWH obteniendo lo siguiente:

 

Ahora vamos al SSMS y lanzamos la consulta a la tabla tabla_auditoria para ver qué registros tenemos almacenados:

 

Y como podemos ver, tenemos los datos de la tabla completados salvo la columna FechaFin y Estado. Y os estaréis preguntado: ¿Y por qué no se han rellenado? Porque no se los hemos pasado. ¿Cuándo se van a rellenar? Vamos a configurarlo. Para ello vamos la pestaña del Secuenciador_DWH y añadimos otra Tarea Ejecutar SQL a la que denominaremos “Log Final No Error”:

 

Añadimos la conexión de la misma manera que la anterior y la configuraremos con la siguiente consulta SQL:


 

Esta consulta nos actualiza los campos de la tabla Estado con el valor “OK” y FechaFin con la sentencia GETDATE() para obtener la fecha y hora del sistema.

En la pestaña de Asignación de parámetros creamos un nuevo parámetro para rescatar el nombre del paquete en cuestión, tal y como se muestra en la imagen:

 

Aceptamos y unimos el contenedor de secuencias con la tarea SQL que acabamos de crear tal que así:

 

Bien, esto lo replicamos para los tres paquetes que tenemos creados. Y os lanzo una pregunta, ¿ya lo tendríamos? … La respuesta es casi, porque ¿qué pasaría si la ejecución de algún paquete es errónea? No la tenemos auditada… por lo que para ello creamos otra “Tarea Ejecutar SQL” a la que vamos a llamar “Log Error”, cuya configuración, para no extenderme más ya, sería de la misma manera que la anterior salvo la consulta SQL:

 

Una vez configurada la tarea, validamos y unimos el contenedor con esta, obteniendo el siguiente esquema:

 

Y aquí, viene el toque final… redobles de tambores…. Sobre la línea verde que acabamos de crear uniendo la tarea SQL con el contenedor, hacemos doble click y se nos abre una ventana en la opción de valor, colocamos Failure y aceptamos.

 
 
Y el paquete resultante queda de la siguiente manera:


Ejecutamos el paquete y nos vamos al SSMS y lanzamos la consulta sobre la tabla_auditoria:

 



Como podemos ver, ahora sí tenemos todos los campos completados correctamente. En caso de que alguna ejecución no se realizase correctamente, el valor de la columna Estado sería KO.

Y con esto, podemos tener un control sobre las ejecuciones de los paquetes en caso de no disponer de toda la información, esta tabla sería la primera a consultar en caso de necesitar hacer una labor de investigación.

Y por hoy ya suficiente para el que siga despierto J.

¡Nos vemos en los datos!