Rodrigo..
Dicho y hecho. El error estaba en consulta que contaba los id_familia. Como hacia referencia a un solo niño, unicamente contaba 1 solo registro que contaba, por lo que siempre era 1 y eliminaba los datos de las tablas sin respetar el if.
Te pongo el nuevo trigger que corrige la consulta y devuelve los datos esperados.
Código sql:
Ver originalCREATE OR REPLACE FUNCTION eliminar_antes_de_nino() RETURNS TRIGGER AS
$$
DECLARE
nino record;
padres record;
BEGIN
DELETE FROM actividad WHERE id_nino=OLD.id_nino;
DELETE FROM beneficio WHERE id_nino=OLD.id_nino;
DELETE FROM educacion WHERE id_nino=OLD.id_nino;
DELETE FROM nino_vive_en WHERE id_nino=OLD.id_nino;
DELETE FROM salud WHERE id_nino=OLD.id_nino;
DELETE FROM trabajo WHERE id_nino=OLD.id_nino;
--DELETE FROM familia_x_hijos WHERE id_nino=old.id_nino;
SELECT INTO nino T1.IF AS id_familia, COUNT(fxh.id_familia) AS numhijos FROM
(SELECT id_familia AS IF FROM familia_x_hijos WHERE id_nino=OLD.id_nino)AS T1
INNER JOIN familia_x_hijos fxh ON T1.IF = fxh.id_familia
GROUP BY T1.IF;
DELETE FROM familia_x_hijos WHERE id_nino=OLD.id_nino;
IF nino.numhijos = 1 THEN
SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=nino.id_familia;
DELETE FROM familia WHERE id_familia=nino.id_familia;
DELETE FROM padre WHERE rut_padre=padres.rut_padre;
DELETE FROM madre WHERE rut_madre=padres.rut_madre;
END IF;
RETURN OLD;
END;
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER borrar_todo_antes_de_nino BEFORE
DELETE ON nino
FOR each ROW EXECUTE PROCEDURE eliminar_antes_de_nino();
La nueva consulta, realmente cuenta si existen mas niños registrados a la familia del niño a borrar.
Espero esta vez si funcione perfecto.
un saludo.