| |||
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 |
| |||
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:
y este es el trigger q me deberia eliminar los datos de las tablas familia, padre y madre: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();
Código:
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 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(); |
| ||||
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 Espero esta vez si te funcione.
__________________ Without data, You are another person with an opinion. W. Edwads Deming |
| |||
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:
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???; 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(); 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 |
| |||
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(); |
| ||||
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 |
| |||
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. |
| ||||
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 Nos cuentas como te va.
__________________ Without data, You are another person with an opinion. W. Edwads Deming |
| |||
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 |
| ||||
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 |
| ||||
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 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 |
| |||
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:
el SELECT INTO nino T1.IFSELECT 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; 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. |
| ||||
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 |