Hola Alejandro:
Hace unos días estuvimos moviendo registros viejos de las tablas de datos censales de la base de datos de producción a una base de datos históricos para disminuir el tamaño de las tablas. Es una tarea que efectuamos muy pocas veces, cada dos o tres años, que implica otras tablas grandes, por ejemplo, logs de accesos, logs de inscripciones, etc. El objetivo es mejorar los tiempos de backups diarios, exportaciones e importaciones para desarrollo, análisis de estadísticas, etc.
En corridas anteriores simplemente se deshabilitaban temporalmente los triggers de delete de las tablas involucradas, para no insertar registros falsos de borrado durante el proceso. En esta oportunidad, para el caso particular de los datos censales, se modificó el stored procedure correspondiente al trigger de delete de las tres tablas de datos censales, comentando simplemente la inserción del registro de log.
El caso de los datos censales, el proceso busca para cada persona todos los registros con fecha de relevamiento anterior al último disponible, los exporta y los borra de las tablas sga_datos_cen_aux2, sga_datos_cen_aux y sga_datos_censales; en esta secuencia, en orden inverso a la cascada de claves foráneas, para evitar errores. Pero surgió un problema al borrar los registros de la tabla principal sga_datos_censales. El stored procedure del trigger de delete de esa tabla, spd_datos_censales, borra en cascada, eliminando todos los registros del mismo nro. de inscripción de las otras tablas (sga_datos_cen_aux y sga_datos_cen_aux2) ignorando la fecha de relevamiento. Como resultado, se borrarron todos los registros de las tablas auxiliares de datos censales, quedando un solo registro testigo del dedastre en la tabla principal sga_datos_censales.
Pudimos reconstruir los datos faltantes en base a las tablas de logs que aun mantenían los valores de las últimas modificaciones de cada registro.
Analizando la causa, detectamos que no se indica la fecha de relevamiento en las dos sentencias delete incluídas en el stored procedure del trigger de delete de sga_datos_censales.
Sobre Guaraní versión 2.9.1 (svn colab):
https://colab.siu.edu.ar/svn/guarani2/versiones/base_de_datos/2.9.1/Sql/Triggers/td_datos_censales.sql
Línea 81:
...
DELETE FROM sga_datos_cen_aux
WHERE sga_datos_cen_aux.unidad_academica = o_unidad_academica
AND sga_datos_cen_aux.nro_inscripcion = o_nro_inscripcion;
DELETE FROM sga_datos_cen_aux2
WHERE sga_datos_cen_aux2.unidad_academica = o_unidad_academica
AND sga_datos_cen_aux2.nro_inscripcion = o_nro_inscripcion;
...
La corrección consistiría en agregar a la expresión WHERE, la fecha de relevamiento que se recibe como parámetro:
...
DELETE FROM sga_datos_cen_aux
WHERE sga_datos_cen_aux.unidad_academica = o_unidad_academica
AND sga_datos_cen_aux.nro_inscripcion = o_nro_inscripcion
AND sga_datos_cen_aux.fecha_relevamiento = o_fecha_relevamien;
DELETE FROM sga_datos_cen_aux2
WHERE sga_datos_cen_aux2.unidad_academica = o_unidad_academica
AND sga_datos_cen_aux2.nro_inscripcion = o_nro_inscripcion
AND sga_datos_cen_aux2.fecha_relevamiento = o_fecha_relevamien;
...
Saludos,
Pablo Revel,
UNS.