Gestionar excepciones de BD
Al ejecutar asignaciones que modifican bases de datos, es posible que MapForce (o MapForce Server o un programa generado por MapForce) encuentre errores relacionados con la BD. Por ejemplo, puede la cuenta de la base de datos no tenga los privilegios suficientes para ejecutar una acción específica de base de datos o puede que existan restricciones de BD que impidan que la asignación inserte o actualice datos no válidos. Esto último puede ocurrir, por ejemplo, si una columna de tabla es obligatoria pero la asignación no proporciona un valor para ella.
Para que sea posible revertir datos si aparecen excepciones de base de datos puede configurar la asignación para que use transacciones de base de datos. Como explicamos a continuación, puede habilitar las transacciones a nivel de la base de datos y a nivel de acciones de tabla.
Transacciones a nivel de componente de BD
Para habilitar transacciones a nivel de componente de BD haga lo siguiente:
1.Haga clic con el botón derecho en el componente de la base de datos y seleccione Propiedades en el menú contextual (También puede hacer doble clic en la barra de título del componente de BD). Esto abre el cuadro de diálogo "Configuración del componente" correspondiente.
2.Marque la casilla Usar transacciones.
Esta acción agrupa todos los cambios realizados por el componente de base de datos en una transacción que se puede revertir en caso de error. Cuando ocurre un error al ejecutar una asignación, el resultado depende de la opción que elija en la lista desplegable:
•revertir transacción de nivel superior y detener: deshace la transacción que contiene todos los cambios hechos por el componente de BD y detiene la ejecución de la asignación.
•revertir transacción de nivel superior y continuar: hace lo mismo que la opción anterior pero permite que la ejecución de la asignación continúe después de revertir la transacción (por ejemplo, para procesar un segundo componente de destino, si lo hay).
Algunas asignaciones pueden contener varios componentes de base de datos que, a su vez, pueden usar todos la misma conexión de base de datos o conexiones completamente distintas. El resultado de esas asignaciones en caso de error depende del motor de ejecución:
•Si la asignación se ejecuta con MapForce, solo se puede procesar un componente de destino mientras se está ejecutando la asignación. Este es el componente para el que está habilitado el botón la Vista previa . Si ocurre un error de BD en ese componente y la casilla Usar transacciones está marcada, entonces se revertirán todos los cambios realizados por ese componente.
•Si la asignación se ejecuta con MapForce Server o con un programa generado por MapForce, se procesan todos los componentes de destino de forma secuencial. En este caso, si ocurre un error de BD la acción de revertir el componente de BD tendrá lugar donde ocurrió el error. La asignación se detendrá o pasará a ejecutar el siguiente componente de destino, según el valor que haya seleccionado en la lista desplegable de la opción Si ocurre un error.
Para consultar todas las opciones configurables del cuadro de diálogo "Configuración del componente" de BD (véase Configurar componentes de BD).
Transacciones a nivel de acciones de tabla
Las transacciones a nivel de acciones de tabla incluyen todas las acciones de tabla (insertar, actualizar, etc.) que hay dentro de una transacción. Con esta configuración, si alguna acción de insertar o actualizar falla en un registro, se puede revertir únicamente la acción que ha fallado y seguir procesando el resto de registros. Para habilitar las transacciones a nivel de acciones de tabla marque la casilla Usar transacciones en el cuadro de diálogo "Acciones de tabla de la base de datos" (véase también Configurar de acciones de tabla de BD).
Estas son las opciones de este cuadro de diálogo:
•Revertir transacción de nivel superior y detener: si la asignación va a actualizar varias tablas entre las que existen relaciones primaria-secundaria, se pueden habilitar las transacciones no solo para la tabla primaria, sino también para la tabla secundaria. Las transacciones se pueden habilitar a distintos niveles, por lo que "primario" hace referencia a la transacción al nivel más alto en la jerarquía. Esta es la transacción a nivel de componente de BD, si habilitó las transacciones a ese nivel. De lo contrario es la transacción definida en la acción de tabla de nivel superior, siempre y cuando el componente contenga varias acciones de tabla anidadas. Para entender esta opción, recuerde que un componente puede actualizar varias tablas de forma jerárquica, como se describe en Insertar datos en tablas vinculadas. Por ejemplo, un componente puede tener como elemento primario una acción "Insertar" que inserta registros de personas y como elemento secundario otra acción "Insertar" que inserta una o más direcciones para cada persona en una tabla distinta. Como las transacciones se pueden habilitar para las dos acciones "insertar", "de nivel superior" se refiere al nivel más alto de la jerarquía (en este ejemplo la persona puede insertar la acción). Por tanto, si ocurre una excepción al insertar una dirección se revierte la acción de nivel superior (que en este ejemplo está a nivel de tabla de persona) y se detiene la ejecución. En otras palabras, si no se puede insertar la dirección no se puede insertar ningún registro de persona.
•Revertir transacción de nivel superior y continuar: ocurre como en la opción anterior, pero la asignación sigue ejecutándose después de revertir la transacción (por ejemplo, para procesar otro componente de destino, si lo hay).
•Revertir transacción actual y detener: si ocurre una transacción, se revierten únicamente los cambios contenidos en la transacción actual; los cambios realizados previamente fuera de la transacción actual se conservan.
•Revertir transacción actual y continuar: ocurre como en la opción anterior, pero la asignación continúa después de deshacer la transacción.
Transacciones almacenadas a nivel de procedimiento
También puede habilitar las transacciones de BD para los procedimientos almacenados a los que se llama como destino de los datos. Para ver un ejemplo, consulte Procedimientos almacenados en componentes de destino. Las transacciones no son compatibles con los procedimientos almacenados a los que se llama como fuente de datos (sin parámetros de entrada) o con aquellos a los que se llama como función (con parámetros de entrada y de salida).
Reversión
Para ver si las transacciones se van a llevar a cabo al ejecutar la asignación, haga clic en la pestaña Resultados y observe el pseudo código SQL que genera MapForce. La siguiente imagen muestra la vista previa de una asignación en la que se han habilitado las transacciones a nivel de componente y a nivel de acción de tabla. Como se ve, una transacción principal engloba toda la operación (entre los comentarios --begin transaction y --commit transaction). También existen otras transacciones menores que ocurren por cada operación "insertar" (identificadas por el comando SAVEPOINT).
Cuando la asignación se ejecuta en MapForce Server o desde un programa generado por MapForce, la reversión tiene lugar en función de las opciones que haya configurado al diseñar la asignación. Por ejemplo, si selecciona la opción Deshacer transacción de nivel superior y continuar, la inserción que haya fallado se revertirá y volverá al punto de recuperación más cercano, y la asignación seguirá intentando insertar registros.
Si ejecuta una asignación en la que se han habilitado las transacciones directamente en MapForce con el comando de menú Resultados | Ejecutar script SQL un cuadro de diálogo le informará cuando encuentre una excepción e BD, por ejemplo:
Hay varias opciones para cambiar el comportamiento posterior:
•Revertir esta transacción y detener la operación
•La transacción actual ya se ha revertido cuando aparece el cuadro de diálogo
•Aparece un error en la parte superior de la ventana de vista previa y en la ventana Mensajes
•Las transacciones de nivel superior sí se envían a la base de datos
•La ejecución de la asignación se detiene con un código de error
Revertir esta transacción y continuar
•La transacción actual ya se ha revertido cuando aparece el cuadro de diálogo
•El error es tratado como una advertencia y aparece en la ventana Mensajes cuando termina de ejecutarse la asignación
•Las transacciones de nivel superior no se ven afectadas
•La asignación sigue ejecutándose con la siguiente entrada del registro (si la transacción no es a nivel de componente) o con el siguiente componente (solo en el caso de MapForce Server)
Revertir transacción de nivel superior y detener la operación
•La transacción actual ya se ha revertido cuando aparece el cuadro de diálogo
•Aparece un error en la parte superior de la ventana de vista previa y en la ventana Mensajes
•Las transacciones de nivel superior se revierten
•La ejecución de la asignación se detiene con un código de error
Nota: | la opción Revertir transacción de nivel superior y detener la operación aparece en el cuadro de diálogo solo si hay transacciones anidadas (puntos de recuperación o savepoints). |
Revertir transacción de nivel superior y continuar
•La transacción actual ya se ha revertido cuando aparece el cuadro de diálogo
•El error es tratado como una advertencia y aparece en la ventana Mensajes cuando termina de ejecutarse la asignación
•Las transacciones de nivel superior se revierten
•La asignación sigue ejecutándose con la siguiente entrada del registro (si la transacción no es a nivel de componente) o con el siguiente componente (solo en el caso de MapForce Server)
Nota: | la opción Revertir transacción de nivel superior y continuar aparece en el cuadro de diálogo solo si hay transacciones anidadas (puntos de recuperación o savepoints). |