Trabajo con Transacciones desde SQL Server Integration Services 2008 – Preparación

Hoy vamos a continuar con la serie dedicada al trabajo con Transacciones desde SSIS 2008 R2. Una vez que vimos los aspectos generales sobre este tema, vamos a comenzar comprobando el estado del servicio MSDTC (Coordinador de Transacciones Distribuidas), que como vimos antes es imprescindible para la correcta manipulación de las transacciones.

MSDTC
He simplificado bastante el paquete con el que hemos estado trabajando últimamente, he quitado tareas, restricciones, expresiones… en fin, que no se parece en casi nada 🙂 porque lo que nos interesa ahora es ver la actualización de los datos según el funcionamiento de las transacciones. Como parte de las modificaciones agregué una Tarea Ejecutar SQL para Eliminar y Crear la tabla ProductosTransacciones (que a su vez es una simplificación de ProductosFecha) y así poder detectar todo lo que ocurra en cuanto a actualización. El código T-SQL es el siguiente:

[sql]
IF  EXISTS (SELECT *
FROM sys.objects WHERE object_id = OBJECT_ID(‘[dbo].[ProductosTransacciones]’)
AND type in (‘U’))
DROP TABLE [dbo].[ProductosTransacciones]
GO
CREATE TABLE [dbo].[ProductosTransacciones](
[IdProducto] [int] NULL,
[Nombre] [nvarchar](50) NULL
) ON [PRIMARY]
[/sql]

Este es el aspecto final y si lo ejecutamos:

PaqueteTransacciones

Partimos de la tabla ProductosTransacciones vacía,  y ejecutamos de forma correcta todas las tareas. Vamos a verlas.

La tarea fuera del contenedor carga todas las filas, aunque las separa, realiza la transformación de columna derivada y realiza dos entradas al mismo destino, (no es nuestro objetivo en este caso realizar unión ordenada de registros) en total había 504 filas y se cargan 504 al destino.

Tarea1Transacc

La primera tarea dentro del contenedor solamente permitirá cargar las filas cortas, así es que de una extracción de 504 registros se produce una carga de apenas 172.

Tarea2Transacc

Y la segunda tarea del contenedor hace lo contrario, ignora las filas cortas y se queda con las largas, por lo que carga 332 filas.

Tarea3Transacc

En este caso, como sale todo bien, se produce una carga doble de todos los registros, por lo que contamos con un total de 1008 filas en destino.

Resulta1tran

Lo último que vamos a hacer hoy es forzar un error para una de las tareas que están dentro del contenedor, en este caso para la segunda en ejecución. Por tanto, ForceExecutionResult = Failure. Al ejecutar tenemos el Flujo de control que refleja el error; pero en el Flujo de datos ha ocurrido todo bien, por lo que en destino existen las mismas 1008 filas cargadas.

Ejecuta1tran

Resulta1tran

El error no ha ocurrido en realidad, le hemos forzado; pero no ha tenido repercusión ni en el contenedor ni en el paquete. Existen dos propiedades que nos permiten forzar la detención del paquete o de un contenedor, cuando la tarea que se ejecuta devuelve error. Son: FailPackageOnFailure y FailParentOnFailure, vamos a ver en la siguiente entrada lo que ocurre al combinar estas propiedades y las propiedades que definen el trabajo con transacciones en SSIS.