Corrección del Diferenciales 001238.sql de la 3.17.0

Hola, esto me llevo mucho tiempo de hacer, el que tenga el mismo problema lo subo por aquí, pero yo tuve muchos repetidos y no se podía hacer la migración. Para terminar con la migración tuve que agregar unas cuantas lineas al sql del mensaje.


-- +++++++++++++++++++++++++++++++++++++++
-- Script de conversión 001238.sql
-- +++++++++++++++++++++++++++++++++++++++

-- Borro causas de perdida de regularidad (requisitos/reglas) que estan duplicadas por migracion desde Guarani 2.
-- Dejo solo una, la que se importó primero (con menor id)
CREATE TEMP TABLE _Tduplicados (nombre varchar(100), regla integer, causa_perdida_reg integer);

INSERT INTO _Tduplicados (nombre, regla)
SELECT nombre, regla
  FROM sga_perdida_regularidad_causas
  GROUP BY nombre, regla
  HAVING COUNT(*) > 1
UNION 
SELECT nombre, regla
  FROM sga_perdida_regularidad_causas
  GROUP BY nombre, regla
  HAVING COUNT(*) = 1;

UPDATE _Tduplicados
   SET causa_perdida_reg = (SELECT MIN(causa_perdida_reg) 
                             FROM sga_perdida_regularidad_causas
                             WHERE nombre = _Tduplicados.nombre 
                               AND regla = _Tduplicados.regla
							);
-- PERSONALIZACION DE UNSE
-- Creamos un temporal de sga_perdidas_regularidad_det para poder hacer la actualizacion

CREATE TEMP table bak_perdida_regularidad_det (perdida_regularidad integer, causa_perdida_reg integer, motivo_solucion character varying(255));

INSERT INTO bak_perdida_regularidad_det SELECT * FROM sga_perdida_regularidad_det;

-- A todas las causas de perdida de regularidad con la misma regla, defino el ID de causa de perdida de regularidad menor recuperado antes.		
UPDATE bak_perdida_regularidad_det
   SET causa_perdida_reg = t.causa_perdida_reg
  FROM sga_perdida_regularidad_causas as a,
       _Tduplicados as t
 WHERE a.causa_perdida_reg = bak_perdida_regularidad_det.causa_perdida_reg
   AND t.nombre = a.nombre
   AND t.regla = a.regla
   AND bak_perdida_regularidad_det.causa_perdida_reg <> t.causa_perdida_reg;

-- Ahora eliminamos todos los registro de la tabla sga_perdida_regularidad_det

DELETE FROM sga_perdida_regularidad_det;

-- Cargamos toda la tabla nuevamente

INSERT INTO sga_perdida_regularidad_det SELECT DISTINCT on (perdida_regularidad, causa_perdida_reg) perdida_regularidad, 
	causa_perdida_reg, motivo_solucion FROM bak_perdida_regularidad_det;

DROP TABLE bak_perdida_regularidad_det;

-- FIN DE PERSONALIZACION UNSE

-- Borro causas de perdida de regularidad que no estan en la temporal
DELETE FROM sga_perdida_regularidad_causas
 WHERE causa_perdida_reg NOT IN (SELECT causa_perdida_reg FROM _Tduplicados);

-- Quito el campo de la tabla y la ck
ALTER TABLE sga_perdida_regularidad_causas DROP CONSTRAINT IF EXISTS ck_sga_perdida_regularidad_causas_para_controlar;
ALTER TABLE sga_perdida_regularidad_causas DROP COLUMN IF EXISTS para_controlar;

-- Creo nueva tabla de configuracion de requisitos de regularidad por propuesta y ubicacion

-- Borro tabla temporal
DROP TABLE _Tduplicados;


-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SIU-GUARANI 3 - Sistema de Gestión Académica
-- Versión 3.17.0
-- Tabla: sga_propuestas_regularidad
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- DROP TABLE IF EXISTS sga_propuestas_regularidad;
CREATE  TABLE sga_propuestas_regularidad
(
	propuesta Integer NOT NULL,
	ubicacion Integer NOT NULL,
	causa_perdida_reg Integer NOT NULL,
	para_controlar Smallint NOT NULL DEFAULT 0
);

-- ALTER TABLE sga_propuestas_regularidad DROP CONSTRAINT pk_sga_propuestas_regularidad;
ALTER TABLE sga_propuestas_regularidad ADD CONSTRAINT pk_sga_propuestas_regularidad PRIMARY KEY (propuesta,ubicacion,causa_perdida_reg,para_controlar);

Revoke all ON sga_propuestas_regularidad FROM public;
-- ++++++++++++++++++++++++++ Fin tabla sga_propuestas_regularidad +++++++++++++++++++++++++++++

GRANT select ON sga_propuestas_regularidad TO public;
GRANT update ON sga_propuestas_regularidad TO public;
GRANT delete ON sga_propuestas_regularidad TO public;
GRANT insert ON sga_propuestas_regularidad TO public;

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SIU-GUARANI 3 - Sistema de Gestión Académica
-- Versión 3.17.0
-- Tabla: sga_propuestas_regularidad
-- Check: ck_sga_propuestas_regularidad_para_controlar
-- Valores: 0 = Regularidad y Readmision / 1 = Regularidad / 2 = Readmision
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- ALTER TABLE sga_propuestas_regularidad DROP CONSTRAINT ck_sga_propuestas_regularidad_para_controlar;
ALTER TABLE sga_propuestas_regularidad ADD CONSTRAINT ck_sga_propuestas_regularidad_para_controlar CHECK (para_controlar IN (0,1,2));

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SIU-GUARANI 3 - Sistema de Gestión Académica
-- Versión 3.17.0
-- Tabla: sga_propuestas_regularidad
-- FK: fk_sga_propuestas_regularidad_sga_propuestas
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- DROP INDEX ifk_sga_propuestas_regularidad_sga_propuestas;
CREATE INDEX ifk_sga_propuestas_regularidad_sga_propuestas ON  sga_propuestas_regularidad (propuesta);

-- ALTER TABLE sga_propuestas_regularidad DROP CONSTRAINT fk_sga_propuestas_regularidad_sga_propuestas; 
ALTER TABLE sga_propuestas_regularidad 
	ADD CONSTRAINT fk_sga_propuestas_regularidad_sga_propuestas FOREIGN KEY (propuesta) 
	REFERENCES sga_propuestas (propuesta) ON UPDATE NO ACTION ON DELETE NO ACTION;

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SIU-GUARANI 3 - Sistema de Gestión Académica
-- Versión 3.17.0
-- Tabla: sga_propuestas_regularidad
-- FK: fk_sga_propuestas_regularidad_sga_ubicaciones
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- DROP INDEX ifk_sga_propuestas_regularidad_sga_ubicaciones;
CREATE INDEX ifk_sga_propuestas_regularidad_sga_ubicaciones ON  sga_propuestas_regularidad (ubicacion);

-- ALTER TABLE sga_propuestas_regularidad DROP CONSTRAINT fk_sga_propuestas_regularidad_sga_ubicaciones; 
ALTER TABLE sga_propuestas_regularidad 
	ADD CONSTRAINT fk_sga_propuestas_regularidad_sga_ubicaciones FOREIGN KEY (ubicacion) 
	REFERENCES sga_ubicaciones (ubicacion) ON UPDATE NO ACTION ON DELETE NO ACTION;

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SIU-GUARANI 3 - Sistema de Gestión Académica
-- Versión 3.17.0
-- Tabla: sga_propuestas_regularidad
-- FK: fk_sga_propuestas_regularidad_sga_perdida_regularidad_causas
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- DROP INDEX ifk_sga_propuestas_regularidad_sga_perdida_regularidad_causas;
CREATE INDEX ifk_sga_propuestas_regularidad_sga_perdida_regularidad_causas ON  sga_propuestas_regularidad (causa_perdida_reg);

-- ALTER TABLE sga_propuestas_regularidad DROP CONSTRAINT fk_sga_propuestas_regularidad_sga_perdida_regularidad_causas; 
ALTER TABLE sga_propuestas_regularidad 
	ADD CONSTRAINT fk_sga_propuestas_regularidad_sga_perdida_regularidad_causas FOREIGN KEY (causa_perdida_reg) 
	REFERENCES sga_perdida_regularidad_causas (causa_perdida_reg) ON UPDATE NO ACTION ON DELETE NO ACTION;

-- +++++++++++++++++++++++++++++++++++++++
-- Fin Script de conversión 001238.sql
-- +++++++++++++++++++++++++++++++++++++++	

Hola Ricardo, este tema lo habiamos visto. Pense que se habian actualizado los nodos.
Justamente solucionaba ese tema de los duplicados.
La solucion es la que subo en este diferencial.
Recorda avisarnos cuando sucede algo como esto.
Saludos!


001238_.sql (7.77 KB)

Hola Ale, creo, todavía no estoy seguro, pero haber resuelto el problema antes que vos jejejeje, tengo mis dudas con respecto al script que pasas,


-- Paso los datos de la tabla auxiliar a la original
INSERT INTO sga_perdida_regularidad_det (perdida_regularidad, causa_perdida_reg, motivo_solucion)
SELECT DISTINCT perdida_regularidad, causa_perdida_reg, motivo_solucion
  FROM aux_sga_perdida_regularidad_det 
  ORDER BY perdida_regularidad;

eso es lo que hice al principio, y no funcionó, porque tenía lo siguiente
perdida_regularidad | causa_perdida_reg | motivo_solucion
1 | 1 | NULL
1 | 1 | ‘Movitov uno’

y que pasaba, con el distinct tomaba todo lo mismo, solo eliminaba los que tengan los tres registros iguales

perdida_regularidad | causa_perdida_reg | motivo_solucion
1 | 1 | NULL
1 | 1 | ‘Movitov uno’
1 | 1 | NULL -----> ELIMINA ESTE

en conclusión resolví ese problema usando distinct on()


-- Paso los datos de la tabla auxiliar a la original
INSERT INTO sga_perdida_regularidad_det (perdida_regularidad, causa_perdida_reg, motivo_solucion)
SELECT DISTINCT ON (perdida_regularidad, causa_perdida_reg) perdida_regularidad, causa_perdida_reg, motivo_solucion
  FROM aux_sga_perdida_regularidad_det 
  ORDER BY perdida_regularidad;

De esa forma deja solo una combinación de perdida_regularidad y causa_perdida_reg.

Saludos! espero que sirva!

Abrazo grande Ale, Sos un maestro, aprendí del mejor!