
Tenemos la necesidad de subir controles de cambios en nuestra base de datos IBM DB2 tenemos un conjunto de sentencias SQL tales como DML o DDL que desean ejecutar como un archivo utilizando el CLP de DB2.
Si alguna de las sentencias contenidas en el archivo falla, es necesario revertir cada instrucción ejecutada con éxito y dejar la base de datos en su estado original. ¿Cómo haces esto?
La respuesta corta es evitar cualquier cambio de estado en la conexión al momento de ejecutar el archivo usando la opción -f del CLP.
Tenemos que tener en cuanta que cualquier sentencia explicita dentro del archivo que pueda comprometer los cambios, cerrar la conexión confirmar todos los cambios hasta ese momento, independientemente de lo que haya designado para la sesión.
Si permanece conectado al final del procesamiento de un archivo usando las opciones +c -s -t -f, puede revertir de forma explícita las transacciones que sucedieron antes del momento del fallo.
Algunas de las sentencias que no podemos soportar dentro de nuestro archivo son QUIT, CONNECT RESET , COMMIT, TERMINATE.
Para el siguiente ejercicio vamos a crear una tabla:
1 2 3 4 |
CREATE TABLE "JESTEVEZ01"."TABLE_TEST" ( "ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 NO CYCLE CACHE 20 NO ORDER ), "NAME" VARCHAR(255 OCTETS) ); |
Vamos a crear un archivo CAMBIOS_DML_DDL.sql, con las siguientes sentencias DDL y DML a ejecutar:
1 2 3 4 5 6 7 |
UPDATE COMMAND OPTIONS USING c OFF; INSERT INTO JESTEVEZ01.TABLE_TEST (NAME) VALUES ('HOLA MUNDO 1'); INSERT INTO JESTEVEZ01.TABLE_TEST (NAME) VALUES ('HOLA MUNDO 2'); ALTER TABLE "JESTEVEZ01"."TABLE_TEST" ADD COLUMN "FULL_NAME_1" VARCHAR(32000 OCTETS); ALTER TABLE "JESTEVEZ01"."TABLE_TEST" ADD COLUMN "FULL_NAME_2" VARCHAR(32000 OCTETS); INSERT INTO JESTEVEZ01.TABLE_TEST (NAME, FULL_NAME_1, FULL_NAME_2) VALUES ('NOMBRE 1', 'FULL NAME 2', 'FULL NAME 3'); |
Ahora vamos a desarrollar un pequeño script de linux para ejecutar el fichero.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#! /bin/bash function terminate { echo "Cerrando la conexion a DB2"; db2 terminate } trap terminate EXIT db2 connect to SAMPLE db2 -l salida.log +c -stf CAMBIOS_DML_DDL.sql if [ $? -ge 4 ]; then echo "Hay errores reversar cambios" db2 rollback else echo "Comprometer cambios en la base de datos" db2 commit fi |
Como vemos en el script el CLP de db2 nos retorna un «exit status» con los resultados de la transacción. Estos son algunos de los valores de «db2 exit status»:
- 8 on system error
- 4 db2 error (constraint violation, object not found etc)
- 2 db2 warning
- 1 no rows found
Como podemos ver con las opciones de CLP de db2, controlando el db2 exit status y asegurando que nuestro fichero DDL o DML no tenga sentencias que puedan comprometer la transaccional podemos realizar cambios de forma automática y reversar en caso de algun fallo.