Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

como hacer este trigger????

Estas en el tema de como hacer este trigger???? en el foro de PostgreSQL en Foros del Web. hola huesos, en la tabla familia_x_hijos tengo al id_familia y al id_niño q me permite contar cuantos hijos tiene cada familia y en la tabla ...

  #31 (permalink)  
Antiguo 22/06/2009, 19:38
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

hola huesos, en la tabla familia_x_hijos tengo al id_familia y al id_niño q me permite contar cuantos hijos tiene cada familia y en la tabla familia tengo id_familia, rut_madre y rut_padre q me permite contar cuantas familias hay, y de hecho en la tabla familia_x_hijos voy almacenando el id_familia y el id_nino q me permite relacionar a q familia pertenece cada niño por lo q un niño pertenece solo y solo a una familia esa familia se puede repetir siempre y cuando vaya correspondido con un id_nino distinto, tb esto me sirve para ver q niños son hermanos, y en la tabla familia tengo id_familia rut_madre rut_padre para ver q padres pertenecen a q familia.... una consulta.... encuentras mala mi logica??? q opinas???.... me gustaria saber tu opinion porfa huesos .... de antemano gracias..... bye
  #32 (permalink)  
Antiguo 22/06/2009, 20:58
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

hola amigos aca yo otra vez, probe agregandole el group by SELECT INTO nino id_familia,count(id_familia) AS numhijos FROM familia_x_hijos WHERE id_nino=old.id_nino group by id_familia; bueno esta vez si me elimina todos los datos de las otras tablas, pero no me elimina los datos del niño y de los padres en las tablas familia, familia_x_hijos, padre y madre y ya no se pq, los triggers q tengo para esto son:

este es el trigger q me elimina los datos de todas las otras tablas excepto los datos de las tablas familia, padre y madre este trigger es:
Código:
Create or replace function eliminar_antes_de_nino() returns trigger as

$$
declare
Begin
delete from actividad where old.id_nino=id_nino;

delete from beneficio where old.id_nino=id_nino;

delete from educacion where old.id_nino=id_nino;

delete from nino_vive_en where old.id_nino=id_nino;

delete from salud where old.id_nino=id_nino;

delete from trabajo where old.id_nino=id_nino;

delete from familia_x_hijos where old.id_nino=id_nino;


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();
y este es el trigger q me deberia eliminar los datos de las tablas familia, padre y madre:
Código:
CREATE OR REPLACE FUNCTION eliminar_familia() returns TRIGGER AS

            $$

            declare
            nino record;
            padres record;
            Begin

            SELECT INTO nino id_familia,count(id_familia) AS numhijos FROM familia_x_hijos WHERE id_nino=old.id_nino group by id_familia;
 
            IF nino.numhijos = 0 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_familia_antes_d_menor before

            DELETE ON nino

   for each row execute procedure eliminar_familia();
pero no me funciona no me eliminan los datos de las tablas familia, padre y madre porfavor amigos ayuda!!!! en q estoy fallando?? ruego su ayuda este me tiene desesperadoooo!!!! de antemano gracias .... bye
  #33 (permalink)  
Antiguo 22/06/2009, 21:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

Rodrigo... Insisto....
Debes sentarte y analizar cada proceso que ejecutas y el orden de las operaciones que realizas.
Cada vez veo nuevas inconsistencias, pero debes ser tu, con los conceptos que hemos aplicado, la persona que debe analizar como hacer uso de las herramientas en tu propio problema. Tu mas que nadie, sabes cmo funciona tu sistema y que es lo que debes hacer.

Hay algo que no me cuadra...
tienes dos triggers bajo la acción before delete on nino

Por que no unes los 2 triggers en uno?
Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION eliminar_antes_de_nino() RETURNS TRIGGER AS
  2.  
  3. $$
  4. DECLARE
  5.             nino record;
  6.             padres record;
  7. BEGIN
  8. DELETE FROM actividad WHERE OLD.id_nino=id_nino;
  9.  
  10. DELETE FROM beneficio WHERE OLD.id_nino=id_nino;
  11.  
  12. DELETE FROM educacion WHERE OLD.id_nino=id_nino;
  13.  
  14. DELETE FROM nino_vive_en WHERE OLD.id_nino=id_nino;
  15.  
  16. DELETE FROM salud WHERE OLD.id_nino=id_nino;
  17.  
  18. DELETE FROM trabajo WHERE OLD.id_nino=id_nino;
  19.  
  20. SELECT INTO nino id_familia,COUNT(id_familia) AS numhijos FROM familia_x_hijos WHERE id_nino=OLD.id_nino GROUP BY id_familia;
  21.  
  22.   IF nino.numhijos = 0 THEN  
  23.      SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=nino.id_familia;
  24.      DELETE FROM familia WHERE id_familia=nino.id_familia;
  25.      DELETE FROM padre WHERE rut_padre=padres.rut_padre;
  26.      DELETE FROM madre WHERE rut_madre=padres.rut_madre;
  27.   END IF;
  28.  
  29. DELETE FROM familia_x_hijos WHERE OLD.id_nino=id_nino;
  30.  
  31. RETURN OLD;
  32. END;
  33. $$
  34.  
  35. LANGUAGE 'plpgsql';
  36.  
  37. CREATE TRIGGER borrar_todo_antes_de_nino BEFORE
  38. DELETE ON nino
  39. FOR each ROW EXECUTE PROCEDURE eliminar_antes_de_nino();

Espero esta vez si te funcione.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #34 (permalink)  
Antiguo 22/06/2009, 21:42
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

gracias huesos probare nuevamente y analizare todo.... esto me tiene desesperado... cualquier cosa posteo gracias otra vez bye...
  #35 (permalink)  
Antiguo 23/06/2009, 17:50
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

hola amigos, especialmente huesos he seguido intentando pero no he podido eliminar los datos de las tablas padre, madre y familia, el orden de eliminacion debe ser este:
1- eliminar datos del niño y la familia de la tabla familia_X_hijos
2- eliminar datos del padre y la madre desde la tabla familia
3- eliminar los datos de los padres de las tablas padre y madre
4- por ultimo eliminar datos del niño desde la tabla niño
este es el orden y mi triggerq tengo es:

Código:
 CREATE OR REPLACE FUNCTION eliminar_antes_de_nino() returns TRIGGER AS
 
       
  
      $$
   
      declare
   
                  nino record;
   
                  padres record;
  
      Begin
   
      DELETE FROM actividad WHERE old.id_nino=id_nino;
   
       
 
      DELETE FROM beneficio WHERE old.id_nino=id_nino;
 
       
  
      DELETE FROM educacion WHERE old.id_nino=id_nino;
 
       
  
      DELETE FROM nino_vive_en WHERE old.id_nino=id_nino;
  
       
        DELETE FROM salud WHERE old.id_nino=id_nino;
  
       
  
      DELETE FROM trabajo WHERE old.id_nino=id_nino;
  
       
  
      SELECT INTO nino id_familia,count(id_familia) AS numhijos FROM familia_x_hijos WHERE id_nino=old.id_nino GROUP BY id_familia;
  
       
  
        IF nino.numhijos = 0 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;
  
       
  
      DELETE FROM familia_x_hijos WHERE old.id_nino=id_nino;
  
       
  
      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();
este es mi trigger q me lo hace, pero solo logra eliminarme los datos de la tabla familia_x_hijos y no me elimina los datos de la tablas familia, padre y madre, lo q no me explico es pq el SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=nino.id_familia; no me permite borrar los datos de las tabla familia, padre y madre pq no me toma esta parte???;

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;

en q estoy fallando??? como dije anteriormente el orden debe ser
primero eliminar los datos del niño y de la familia a la q pertenece desde la tabla familia_x_hijos, segundo debe eliminarce los datos de la tabla familia donde esta el id de la familia y el rut del padre y la madre q pertenecen a esa familia y por ultimo deben eliminarce los datos del padre y la madre de sus respectivas tablas, porfavor amigos diganme en q estoy fallando porfavor!!!! llevo dias intentando esto y no logro solucionarlo porfavor estoy desesperado!!!! ruego su ayuda.... de antemano gracias.... bye
  #36 (permalink)  
Antiguo 23/06/2009, 19:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

basado en esta estructura que posteaste en este foro
hola huesos, la estructura de mi tabla niño es
|id_nino (pk)| |nombre_nino| apellido_nino| etc...|

lo q necesito es q se me elimine a los padres una vez q se elimine al niño y ya la familia no tenga mas hijos pq hasta ahora solo me elimina las demas tablas pero no me elimina los datos de la tabla familia ni de las tablas padre y madre cuando la familia ya no tiene mas hijos y por lo tanto deja de existir.... las estructura de mis tablas es:

Cita:
tabla familia:
|id_familia(pk) |rut_madre (fk)| rut_padre (fk)|

tabla padre:
|rut_padre|nombre_padre|etc...|

tabla madre:

|rut_madre (pk)| nombre_madre| etc...|

tabla familia_x_hijos

|id_familia (pk) (fk tabla familia)| id_nino (pk) (fk tabla nino)|
Como borrar primero de la tabla familia, si existen registros dependientes de padre y madre?
Prueba en este orden

DELETE FROM padre WHERE rut_padre=padres.rut_padre;
DELETE FROM madre WHERE rut_madre=padres.rut_madre;
DELETE FROM familia WHERE id_familia=nino.id_familia;

Creo que es esto, ya que dices que de familia_x_hijos los datos se borran correctamente. Si miras bien, la tabla familia_x_hijos también tiene dependencias de familia y debería borrarse primero de esta tabla antes que familia.
Prueba el nuevo orden y dinos si ya se borran los datos de padre y madre.

Vamos por partes y detectando inconsistencias.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #37 (permalink)  
Antiguo 23/06/2009, 19:47
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

hola huesos sorry por todo, de verdad sorry por aun estar con el problema e insistir, pero
no me funciona, probe la ultima manera q me dijiste pero aun no me elimina ni de la tabla
familia ni de las tablas padre y madre de verdad no se pq no me elimina, pero porfavor ruego
su ayuda para lograr saber en q estoy fallando, si la tabla familia se compone de id_familia
como pk y de rut_madre y rut_padre como fk pertenecientes a estas respectivas tablas al tener esta composicion en q estare falland si
al eliminar a mano a la familia antes de eliminar al padre y la madre de sus tablas si
me las elimina pero no me permite eliminar primero al padre y a la madre antes de eliminar
a la familia q componen estos en la tabla familia, esta bien esta composicion o ahi estoy fallando???
porfavor amigos ruego su ayuda!!! estoy realmente desesperado porfavor ayuda!!! de antemano gracias.... bye

PD: la forma como lo probe ultimamente es esta:
Código:
      CREATE OR REPLACE FUNCTION eliminar_antes_de_nino() returns TRIGGER AS
 
       
  
      $$
   
      declare
   
                  nino record;
   
                  padres record;
  
      Begin
   
      DELETE FROM actividad WHERE old.id_nino=id_nino;
   
       
 
      DELETE FROM beneficio WHERE old.id_nino=id_nino;
 
       
  
      DELETE FROM educacion WHERE old.id_nino=id_nino;
 
       
  
      DELETE FROM nino_vive_en WHERE old.id_nino=id_nino;
  
       
        DELETE FROM salud WHERE old.id_nino=id_nino;
  
       
  
      DELETE FROM trabajo WHERE old.id_nino=id_nino;

     
  
       
  
      SELECT INTO nino id_familia,count(id_familia) AS numhijos FROM familia_x_hijos WHERE id_nino=old.id_nino GROUP BY id_familia;
  
       
  
        IF nino.numhijos = 0 then  
  
           SELECT INTO padres rut_padre,rut_madre 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;

           DELETE FROM familia WHERE id_familia=nino.id_familia;
 
        end IF;
  
       
   DELETE FROM familia_x_hijos WHERE old.id_nino=id_nino;
      
  
       
  
      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();
  #38 (permalink)  
Antiguo 23/06/2009, 21:00
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

Rodrigo...

Si quieres, me mandas al correo un backup de la base de datos y te ayudo con el tema.
Es bien dificil tratar de recomendar cosas sin poder realizar pruebas.


Cuando demos con la solución la posteamos para compartirla con la comunidad.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 25/06/2009 a las 09:33
  #39 (permalink)  
Antiguo 23/06/2009, 21:33
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

Ok huesos muchas gracias por ayudarme te envie el backup de mi bd a tu correp.... de antemano gracias.... bye
  #40 (permalink)  
Antiguo 24/06/2009, 13:02
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

Hola amigos, especialmente a huesos, porfavor confirmame si es q te llego mi mail con el respaldo de mi bd pls..... te lo agradeceria mucho..... de antemano gracias.... bye.
  #41 (permalink)  
Antiguo 25/06/2009, 07:38
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

Parece que ya funciona rodrigo. Ya logré que eliminara de la tabla padre,madre,familia,familia_x_hijos.

Te dejo el trigger. Revisalo y si cumple tus expectativas, explicamos paso a paso que era lo que pasaba y por que no funcionaba.

Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION eliminar_antes_de_nino() RETURNS TRIGGER AS
  2. $$
  3. DECLARE
  4.  
  5. nino record;
  6. padres record;
  7.    
  8. BEGIN
  9.  
  10. DELETE FROM actividad WHERE id_nino=OLD.id_nino;
  11. DELETE FROM beneficio WHERE id_nino=OLD.id_nino;
  12. DELETE FROM educacion WHERE id_nino=OLD.id_nino;
  13. DELETE FROM nino_vive_en WHERE id_nino=OLD.id_nino;
  14. DELETE FROM salud WHERE id_nino=OLD.id_nino;
  15. DELETE FROM trabajo WHERE id_nino=OLD.id_nino;
  16. --DELETE FROM familia_x_hijos WHERE id_nino=old.id_nino;
  17.  
  18. SELECT INTO nino id_familia,COUNT(id_familia) AS numhijos FROM familia_x_hijos WHERE id_nino=OLD.id_nino GROUP BY id_familia;
  19. DELETE FROM familia_x_hijos WHERE id_nino=OLD.id_nino;
  20.  
  21. IF nino.numhijos = 1 THEN  
  22.   SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=nino.id_familia;
  23.   DELETE FROM familia WHERE id_familia=nino.id_familia;
  24.   DELETE FROM padre WHERE rut_padre=padres.rut_padre;
  25.   DELETE FROM madre WHERE rut_madre=padres.rut_madre;  
  26. END IF;      
  27. RETURN OLD;
  28. END;
  29.  
  30. $$
  31. LANGUAGE 'plpgsql';
  32. CREATE TRIGGER borrar_todo_antes_de_nino BEFORE
  33.    DELETE ON nino
  34.    FOR each ROW EXECUTE PROCEDURE eliminar_antes_de_nino();

Nos cuentas como te va.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #42 (permalink)  
Antiguo 25/06/2009, 11:02
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

Gracias huesos, lo probare y luego comento.... gracias... bye
  #43 (permalink)  
Antiguo 25/06/2009, 11:46
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

Hola huesos he probado el trigger q me sugeriste claro este me elimina al padre a la madre y a la familia pero sin importar q esta familia siga teniendo hijos rellacionados a ella, es decir si tengo dos hermanos q pertenecen a una familia, yo borro a uno de ellos y tb se me borra los datos de su padre madre y los datos de la tabla familia, probe cambiandole en el if asi: IF nino.numhijos = 0 then , pero la familia al tener un solo hijos me elimina todos los datos del niño exceptuando los datos de los padres en las tablas padre, madre y familia; lo q necesito q haga el triger es q al eliminar a un niño si este tiene uno o mas hermanos q pertenecen a la misma familia (obviamente) solo me elimine a ese niño todos los datos de este y en el caso en q la familia solo tenga un hijo q al eliminar a este niñi ahi si me borre todos los datos del niño y de su familia (de las tablas; padre madre, familia_x_hijos, y familia) y en el caso en q este niño tenga mas hermanos se eliminen todos los datos del niño exceptuando los datos perteneciente a la familia de este niño ya q esta familia tiene mass hijos, porfavor huesos necesito ayuda porfa espero me entiendas y me guies, yo mientras seguire intentando..... de antemano gracias.... bye
  #44 (permalink)  
Antiguo 25/06/2009, 16:19
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

Rodrigo.. Como veo el trigger lo veo bien conceptualmente, perote pido un favor... mandame datos de ejemplo para hacer los ensayos.

Por que es nino.numhijos=1?
Fijate que el error se alojaba en que es necesario borrar primero de la tabla familia_x_hijos antes que borrar en las otras tablas. Por esta razón al tener dependencias, impedía que se borraran los datos. Lo pongo =1, ya que al momento de requerir el id_familia, debe existir aun ese dato. Posterior a obtener el dato de esta tabla se borra de la tabla familia_x_hijos, pero el valor almacenado en el record sigue siendo 1, en caso de que sea el ultimo. Si es mayor, se supone no debe entrar al if.

Si me dices que está fallando, el problema debe estar en el count, pero te solicito me mandes mas datos para ensayar. Cada que borro, hay que llenar varias tablas. y me da física pereza

Ya estamos cerca y de esta forma, es mas fácil llegar a una solución.

Un saludo rodrigo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #45 (permalink)  
Antiguo 25/06/2009, 16:57
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

Ok huesos te envio de inmediato el backup de la bd con mas datos, gracias te lo envio de inmediato.... bye
  #46 (permalink)  
Antiguo 25/06/2009, 19:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

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 original
  1. CREATE OR REPLACE FUNCTION eliminar_antes_de_nino() RETURNS TRIGGER AS
  2. $$
  3. DECLARE
  4.  
  5. nino record;
  6. padres record;
  7.    
  8. BEGIN
  9.  
  10. DELETE FROM actividad WHERE id_nino=OLD.id_nino;
  11. DELETE FROM beneficio WHERE id_nino=OLD.id_nino;
  12. DELETE FROM educacion WHERE id_nino=OLD.id_nino;
  13. DELETE FROM nino_vive_en WHERE id_nino=OLD.id_nino;
  14. DELETE FROM salud WHERE id_nino=OLD.id_nino;
  15. DELETE FROM trabajo WHERE id_nino=OLD.id_nino;
  16. --DELETE FROM familia_x_hijos WHERE id_nino=old.id_nino;
  17.  
  18. SELECT INTO nino T1.IF AS id_familia, COUNT(fxh.id_familia) AS numhijos FROM
  19. (SELECT id_familia AS IF FROM familia_x_hijos WHERE id_nino=OLD.id_nino)AS T1
  20. INNER JOIN familia_x_hijos fxh ON T1.IF = fxh.id_familia
  21. GROUP BY T1.IF;
  22. DELETE FROM familia_x_hijos WHERE id_nino=OLD.id_nino;
  23.  
  24. IF nino.numhijos = 1 THEN  
  25.   SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=nino.id_familia;
  26.   DELETE FROM familia WHERE id_familia=nino.id_familia;
  27.   DELETE FROM padre WHERE rut_padre=padres.rut_padre;
  28.   DELETE FROM madre WHERE rut_madre=padres.rut_madre;  
  29. END IF;      
  30. RETURN OLD;
  31. END;
  32.  
  33. $$
  34. LANGUAGE 'plpgsql';
  35. CREATE TRIGGER borrar_todo_antes_de_nino BEFORE
  36.    DELETE ON nino
  37.    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.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #47 (permalink)  
Antiguo 25/06/2009, 20:06
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

ok huesos muchas gracias lo probare y posteo gracias otra vez..... bye
  #48 (permalink)  
Antiguo 25/06/2009, 20:19
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: como hacer este trigger????

huesos probasdo y funcionando muchas gracias!!!! te pasaste no se como agradecerte en serio!!!!.... la ultima pregunta porfavor .... me puedes explicar esta parte del trigger para poder entenderlo

Código:
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;
el SELECT INTO nino T1.IF

ese T1 es q? es elresultado del count???

este SELECT id_familia AS IF FROM familia_x_hijos WHERE id_nino=old.id_nino)AS T1

AS IF q significa??? y fxh de donde lo sacaste??? porfavor amigo me gustaria saber eso, ya q el trigger me funcionó pero el 99% lo hiciste tu es por eso q me gustaria saber q sigfica todo eso q te pregunte para aprenderlo pls si??? muchas gracias de verdad .... simplemente maestro!!!! gracias bye.
  #49 (permalink)  
Antiguo 25/06/2009, 21:54
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer este trigger????

Claro rodrigo.

En la tabla familia_x_hijos tenia la estructura id_familia e id_nino. Se podían repetir en varias ocasiones la familia, pero el niño era un registro unico.
Por esa razón, el conteo de id_familia solo contaba 1 registro asumiendo que existia un unico registro de esa familia en esta tabla.

Ahora si explicar la consulta.
Lo que está entre paréntesis se podría definir como una tabla virtual resultado de una consulta. Fijate que cuando se cierra el paréntesis, se pone un alias a la tabla llamada T1.
En pocas palabras, la consulta dentro del parentesis, se comporta como tabla y T1 es el nombre temporal que usamos para utilizar los datos que generen la consulta.
Los alias son llamados desde fuera de la consulta anteponiendo el nombre de la tabla. IF es el alias que le puse al campo (id_familia).

Igualmente, fxh se refiere al alias utilizado para referirse a la tabla familia_x_hijos(por sus iniciales) y tener un manejo mas limpio de los datos.

Es necesario hacer uso de inner join, ya que necesitamos el conteo del campo id_familia que corresponda al id_familia del niño a eliminar, es por eso que el conteo se hace sobre la tabla con la condición del id_familia y no del id_nino.

No se si te queda claro.

Un placer haberte ayudado, y como te había dicho desde un principio, todo era cuestión de eliminar en el orden correcto los datos de las diferentes tablas.

Un saludo rodrigo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:57.