Migración N a 1 - Error en Script de Datos Censales

Buen dia:

Estamos migrando en entorno de pruebas en un esquema centralizado donde habrían 2 Bases de diferentes Unidades Académicas. La versión es 3.14 en la cual ya se encuentra funcionando hace algunos meses la Facultad de Ciencias Económicas y estamos probando sumar a dicha base la Facultad de Ciencias Agrarias.

En el Módulo de migración de personas, hemos detectado las personas que se encuentran en ambas bases y ya etá depurado cuales deben pasar de base y cuales no. En el siguiente módulo, correspondiente a Datos Censales, nos encontramos con un error en el script 02_mdp_datos_censales.

Por lo que estuve analizando, este script elimina los datos censales del esquema de negocio, de aquellos alumnos que se encuentran en ambas bases y cuyo campo migrar_datos_censales está seteado en 1 dentro de la tabla _cnv_pk_personas. Cuando intenta eliminar los datos de la tabla negocio.mdp_datos_censales, no lo puede hacer porque está referenciado por la tabla negocio.mdp_eleccion_institucion.

Esta es la última línea del error:

2018/07/10 07:37:42 - 02_mdp_datos_censales - ERROR: update or delete on table “mdp_datos_censales” violates foreign key constraint “fk_mdp_eleccion_institucion_mdp_datos_censales” on table “mdp_eleccion_institucion”
Detail: Key (dato_censal)=(32002) is still referenced from table “mdp_eleccion_institucion”.

Es un error del script o hay algo que corregir en los datos? Pensé que lo correcto sería eliminar primero los registros (para las personas/dato censal que se seteo para migrar los datos censales) de la tabla mdp_eleccion_institucion.

Gracias por la ayuda

Ezequiel Molina
Fac. de Cs. Agrarias - UNJu

Buenas tardes Ezequiel, creo q estás en lo correcto.
Deberías borrar antes los datos censales de la persona y también los de estas dos tablas:

DELETE FROM mdp_eleccion_institucion WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
DELETE FROM mdp_eleccion_propuesta WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
Fue un error en nuestros scripts no haberlos incluido en el archivo tal como mencionas.

Saludos.

Estimados, Buen dia:

Me sucede lo mismo. Al querer ejecutar Datos Censales, nos encontramos con un error en el script 02_mdp_datos_censales, el siguiente:

02_mdp_datos_censales - ERROR: update or delete on table “mdp_datos_censales” violates foreign key constraint “fk_mdp_eleccion_institucion_mdp_datos_censales” on table “mdp_eleccion_institucion”
2018/10/31 17:54:10 - 02_mdp_datos_censales - Detail: Key (dato_censal)=(707) is still referenced from table “mdp_eleccion_institucion”.

Le puse las dos lineas en el script “02_mdp_datos_censales.sql”

DELETE FROM mdp_eleccion_institucion WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
DELETE FROM mdp_eleccion_propuesta WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);

Pero sigue arrojando el mismo error. Pregunta: No falta ningún DELETE más, ejemplo en la tabla mdp_datos_censales?

PD: Tengo la versión 3.15.0 del migrador del Kettle.

Quedo atento a su Rta

Saludos!

Las tablas que referencian a la tablamdp_datos_censales son las siguientes:
mdp_datos_actividades
mdp_datos_economicos
mdp_datos_personales
mdp_eleccion_institucion
mdp_eleccion_propuesta
mdp_personas_allegados

Lo podes ver con la siguiente consulta:

select 	conname as "Foreign Key",
			t1.relname as "Tabla que referencia",
			a1.attname as "Columna que referencia",
			t2.relname as "Tabla referenciada",
			a2.attname as "Columna referenciada"
	from 	pg_constraint as c, 
			pg_class as t1, 
			pg_class as t2,
			pg_attribute as a1,
			pg_attribute as a2
	where 	
                        t2.relname = 'mdp_datos_censales'
		and c.conrelid = t1.relfilenode 
		and t2.relfilenode = c.confrelid
		and a1.attrelid = t1.relfilenode 
		and a2.attrelid = t2.relfilenode 
		--and a1.attnum = any (c.conkey)
		--and a2.attnum = any (c.confkey)
		and (
		  ( c.conkey[1] = a1.attnum and  c.confkey[1] = a2.attnum ) OR
		  ( c.conkey[2] = a1.attnum and  c.confkey[2] = a2.attnum ) OR
		  ( c.conkey[3] = a1.attnum and  c.confkey[3] = a2.attnum ) OR
		  ( c.conkey[4] = a1.attnum and  c.confkey[4] = a2.attnum ) OR
		  ( c.conkey[5] = a1.attnum and  c.confkey[5] = a2.attnum ) OR
		  ( c.conkey[6] = a1.attnum and  c.confkey[6] = a2.attnum ) OR
		  ( c.conkey[7] = a1.attnum and  c.confkey[7] = a2.attnum ) OR
		  ( c.conkey[8] = a1.attnum and  c.confkey[8] = a2.attnum ) OR
		  ( c.conkey[9] = a1.attnum and  c.confkey[9] = a2.attnum ) OR
		  ( c.conkey[10] = a1.attnum and  c.confkey[10] = a2.attnum ) 
		)
	order by conname	
		;

En ese script 02_mdp_datos_censales, donde estan los DELETES al comienzo, faltaria borrar los datos de esas dos tablas. Deberías agregar estos DELETES:


DELETE FROM mdp_eleccion_propuesta     WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
DELETE FROM mdp_eleccion_institucion   WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);

DELETE FROM his_eleccion_propuesta       WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
DELETE FROM his_eleccion_institucion     WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);

Quería realizar un aporte respecto al tema, a fin de mejorar a futuro los scripts de migración.

En el caso de datos censales, los scripts actuales lo que hacen es eliminar los datos censales que ya existen en el esquema negocio (es decir los datos de la/las personas que figuran en las Unidades Académicas que ya están en G3) para poder ingresar los datos censales de las mismas personas que vienen de la base de G2 que se está agregando.

Esto puede provocar la pérdida de datos más actualizados, si estos están en G3 y ser reemplazados por datos antiguos de G2. Nosotros hicimos una comparación de los datos antes de correr este scritp, los de G2 vs. los de G3, y si los datos a pasar eran más antiguos, los seteamos en cero para que no se haga el traspaso. Si bien ese proceso debe ser complejo para automatizar en un script, deberían tenerlo en cuenta al menos como un agregado en la documentación de forma que quién está migrando sepa el resultado de correr dicho script.

Espero sirva el comentario.

Saludos

Ezequiel, respecto a tu comentario:

En el caso de datos censales, los scripts actuales lo que hacen es eliminar los datos censales que ya existen en el esquema negocio (es decir los datos de la/las personas que figuran en las Unidades Académicas que ya están en G3) para poder ingresar los datos censales de las mismas personas que vienen de la base de G2 que se está agregando.
No es asi, o en parte. Todo depende como tengan definido el parámetro [b]migrar_datos_cens[/b] que esta definido en la tabla de valores default [b]mig._mig_default[/b] Por defecto esta definido con el valor 2.

Parametro: migrar_datos_cens
Define si se migran o no los datos censales de un alumno que ya existe en la base de G3:
Valores:
0 = No se migran los datos censales. Se dejan los que ya estan en la base de G3
1 = Se migra siempre (Se borran los datos censales que el alumno tenga en la base de Guarani 3 y se reemplazan por los nuevos a migrar)
2 = Solo se migra si los datos de la base a migrar tienen fecha de actualizacion mas reciente (Valor por defecto)

Este dato es utilizado en la configuracion de la tabla mig._cnv_pk_personas para definir el valor del campo “migrar_datos_censales”

SELECT * FROM mig._mig_default WHERE nombre_campo = 'migrar_datos_cens';

Revisar la configuración de los parámetros existentes en la tabla mig._mig_default que tienen valores por defecto pero pueden cambiarlos por los valores que crean conveniente antes de realizar la migracion.
La creacion de esta tabla y la inserción de los datos estan en el archivo: 02_Modulos\01_TablasConversionPK\01_mig_default.sql
Pueden editarlo y cambiar los valores antes de migrar.

Ver documentación de configuracion de datos por defecto.

Alejandro:

Muy bueno! eso era a lo que me refería, veo que lo tuvieron en cuenta para la versión 3.16, la verdad es que no había visto la documentación para dicha versión ya que por el momento seguimos en 3.14.

Saludos

Ezequiel, ya se publicó la version 3.16. Por favor vean de convertir la base (al menos una de prueba para migración) y probar la migración con estos scripts de la version 3.16

Buenas tardes,
Estoy migrando con los script de la vesion 3.16 y el script 02_mdp_datos_censales tiene los 4 DELETES indicados
DELETES :

DELETE FROM mdp_eleccion_propuesta     WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
DELETE FROM mdp_eleccion_institucion   WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);

DELETE FROM his_eleccion_propuesta       WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);
DELETE FROM his_eleccion_institucion     WHERE dato_censal IN (SELECT dato_censal FROM _temp_dc);

y me da el mismo error, que otra cosa puede ser?
Aguardo sus comentarios.
Muchas Gracias.

Puede ser por la tabla mdp_personas_allegados que este faltando borrar los registros?
Esta tabla pasó al esquema de datos censales en la version 3.16.0
Envio el script de migración de la version 3.17 que debería funcionar para la version 3.16 porque en esta versión cambió la estructura de esa tabla.
Compara este archivo con el que estas realizando la migración.


02_mdp_datos_censales.sql (7.49 KB)

Buenos días Alejandro,
Actualizando con el script enviado el trabajo se ejecutó correctamente.
Muchas gracias.