Ejemplo: revertir transacciones
En este ejemplo aprenderá las distintas formas de gestionar errores de BD al ejecutar una asignación que modifica una base de datos. La BD que se usa en este ejemplo almacena registros de usuario (tabla users) y direcciones (tabla addresses). Cada usuario puede tener una dirección, dos o ninguna (por ejemplo, una dirección personal y una de trabajo). Cada una de las direcciones de la tabla contiene un campo user_id que apunta al campo id de la tabla users. Por esta razón, la tabla users es una tabla primaria para la tabla addresses. La lista siguiente muestra los scripts SQL de creación para ambas tablas (observe que la sintaxis se puede aplicar a una base de datos SQLite).
CREATE TABLE |
Tablas de origen
El objetivo de este ejemplo es copiar todos los datos de las tablas users y addresses a otras tablas nuevas: new_users y new_addresses. Estas tablas nuevas son prácticamente idénticas a las anteriores; la única diferencia es que la tabla new_tables no admite valores null para las columnas is_shipping o is_billing, como se ve resaltado en azul en el código de ejemplo siguiente. Esto significa que pueden ocurrir excepciones si aparecen valores null.
CREATE TABLE new_users (id INTEGER NOT NULL PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT UNIQUE NOT NULL);
CREATE TABLE new_addresses (id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER NOT NULL, is_shipping INTEGER NOT NULL, is_billing INTEGER NOT NULL, type TEXT NOT NULL, city TEXT NOT NULL, street TEXT NOT NULL, number INTEGER NOT NULL, FOREIGN KEY (user_id) REFERENCES new_users (id) ) ; |
Tablas de destino
A continuación mostramos la asignación que copia todos los datos de las tablas antiguas a las nuevas. Puede encontrar esta asignación en <Documentos>\Altova\MapForce2023\MapForceExamples\Tutorial\DatabaseExceptions.mfd.
Como se ilustra en la imagen anterior, esta asignación está configurada para copiar datos de forma literal de un componente de BD de origen a uno de destino. Hemos omitido cualquier otra transformación para simplificar. En este ejemplo tanto el componente de origen como el de destino pertenecen a la misma base de datos y solo las tablas de origen y de destino son distintas. Haga clic en el botón del componente de destino y observe que todas las entradas de registro se borran antes de cada acción "insertar". Esto garantiza que las tablas de destino estén siempre vacías antes de cada inserción.
Como hemos explicado antes, las excepciones ocurren si la tabla de origen addresses contiene valores null. Para comprobar si la tabla de origen contiene valores null:
1.Haga clic en la pestaña Consulta de la DB.
2.Haga clic con el botón derecho en la tabla addresses y seleccione Mostrar en Editor SQL | SELECT.
3.Haga clic en Ejecutar consulta .
Como se ve más arriba, existen varios campos NULL en la tabla de origen addresses. Sabiendo esto, al ejecutar esta asignación tiene varias opciones para gestionar las excepciones, por ejemplo:
•A) Si aparece una excepción, se revierten todos los cambios. En otras palabras, no se inserta ninguna entrada de registro si los datos de origen contienen entradas de registro no válidas.
•B) si aparece una excepción, se omiten las entradas de registro en las que se da esa excepción pero se siguen insertando entradas de registro válidas.
Caso A: revertir todos los cambios si se encuentra una excepción
El objetivo en este caso es revertir todos los cambios realizados a la base de datos si se encuentra una excepción. Para configurar la asignación para que eso ocurra:
1.Haga clic con el botón derecho en la barra de título del componente de BD de destino y seleccione Propiedades en el menú contextual. También puede hacer doble clic en la barra de título para abrir el cuadro de diálogo "Configuración del componente".
2.Marque la casilla Usar transacciones y seleccione revertir transacción de nivel superior y detener.
Cuando la asignación está configurada como en el ejemplo anterior, cualquier excepción que ocurra revertirá la transacción de nivel superior al nivel de los componentes de BD. Para ejecutar la asignación con esta configuración:
1.Haga clic en la pestaña Resultados.
2.En el menú Resultados, haga clic en Ejecutar script SQL. Ahora la asignación encuentra una excepción porque hay un valor null en la tabla de origen addresses. Aparece el cuadro de diálogo "Excepción de transacción de base de datos".
3.Deje la configuración como está y haga clic en Aceptar.
Este es el resultado:
•se revierten todos los cambios.
•no se inserta ninguna entrada de registro en la tabla new_users
•no se inserta ninguna entrada de registro en la tabla new_addresses
Caso B: revertir la transacción actual y continuar con la ejecución
El objetivo en este caso es omitir las entradas de registro que generen una excepción pero seguir insertando entradas de registro válidas. Para configurar la asignación para que eso ocurra:
1.Haga clic en el botón junto a la tabla new_users, marque la casilla Usar transacciones y seleccione revertir transacción actual y continuar
2.Haga clic en el botón junto a la tabla new_addresses, marque la casilla Usar transacciones y seleccione revertir transacción actual y continuar
Cuando se ejecuta una asignación con esta configuración aparece el cuadro de diálogo "Excepción de transacción de base de datos". Seleccione la opción Revertir esta transacción y continuar, como se muestra en la imagen siguiente, para revertir únicamente esa transacción y seguir ejecutando la asignación.
Este es el resultado:
•se revierten todas las transacciones erróneas.
•se insertan 5 usuarios de 5 (porque ninguna de esas entradas de registro generó una excepción)
•se insertan 2 de 5 direcciones (porque 3 de ellas contenían valores null y generaron excepciones)
Caso C) Revertir transacción de nivel superior y continuar con la ejecución
Objetivo: si falta por insertar una dirección tampoco se inserta la entrada de registro del usuario primario. Para configurar la asignación con esta finalidad:
1.Haga doble clic en la barra del título del componente de BD y desmarque la casilla Usar transacciones.
2.Haga clic en el botón junto a la tabla new_users, marque la casilla Usar transacciones y seleccione revertir transacción actual y continuar
3.Haga clic en el botón junto a la tabla new_addresses, marque la casilla Usar transacciones y seleccione revertir transacción de nivel superior y continuar
Al ejecutar la asignación con esta configuración aparece el cuadro de diálogo "Excepción de transacción de base de datos". Configure las opciones como en la imagen siguiente y repita su selección tantas veces como se lo pida la aplicación:
Este es el resultado:
•se insertan 2 usuarios (Sharda Junker, Tobie Hughey)
•se inserta 1 dirección
Explicación: la usuaria "Sharda Junker" es la única que no tiene una dirección. Como no ocurrieron excepciones en este caso, la entrada de registro se insertó. El segundo usuario, "Tobie Hughey", se insertó porque es el único usuario sin excepciones a nivel de la dirección. El resto de entradas de registro no se insertaron porque había al menos una dirección en la que ocurrió una excepción, por lo que las transacciones se revirtieron.
Hay dos direcciones que no tienen valores null, por lo que no generan excepciones. Se trata de las direcciones con id=1 e id=4. La transacción de inserción para la primera dirección se revirtió porque la transacción del usuario primario también debía revertirse. Por lo tanto, la única dirección que llegó a insertarse fue id=4.
Observe que se puede obtener el mismo resultado de esta otra manera:
1.Haga clic en el botón junto a la tabla new_users, marque la casilla Usar transacciones y elija revertir transacción actual y continuar
2.Haga clic en el botón junto a la tabla new_addresses y desmarque la casilla Usar transacciones.
Ejecutar la asignación con MapForce Server
Si tiene una licencia para MapForce Server también puede ejecutar la asignación desde la línea de comandos tanto en Linux como en macOS y en Windows:
1.Compile la asignación en un archivo de ejecución de MapForce Server (.mfx) con el comando de menú Archivo | Compilar en archivo de ejecución de MapForce Server (véase también Compilar asignaciones en archivos de ejecución de MapForce Server).
2.Copie el archivo .mfx y la base de datos ExceptionsDemo.sqlite en un directorio en el equipo servidor al que llamaremos "directorio de trabajo".
3.Cambie el símbolo del sistema al directorio de trabajo y ejecute MapForce Server con el siguiente comando:
mapforceserver run DatabaseExceptions.mfx |
Notas:
•mapforceserver es la ruta de acceso al ejecutable de MapForce Server con las modificaciones que requiera su sistema operativo. Cambie la ruta de acceso al archivo .mfx como convenga. Por ejemplo, en un equipo Linux la ruta sería: /opt/Altova/MapForceServer2023/mapforceserver.
Al ejecutar la asignación en el servidor también puede ejecutar asignaciones como una llamada API o como un trabajo de FlowForce, sea puntualmente o de forma recurrente. Para más información consulte el apartado Automatización con MapForce Server.