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

Problema al habilitar/deshabilitar triggers en postgre 8.2

Estas en el tema de Problema al habilitar/deshabilitar triggers en postgre 8.2 en el foro de PostgreSQL en Foros del Web. Hola amigos, mi problema es q tengo dos triggers los cuales necesito deshabilitar al momento de querer actualizar los datos de un niño, y volver ...
  #1 (permalink)  
Antiguo 26/07/2009, 14:13
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 11 meses
Puntos: 0
Problema al habilitar/deshabilitar triggers en postgre 8.2

Hola amigos, mi problema es q tengo dos triggers los cuales necesito deshabilitar al momento de querer actualizar los datos de un niño, y volver a habilitarlos en el momento de solo actualizar solo un campo de la tabla niño (campo estado, q puede estar activo o desactivado) la cosa es q cuando lo deshabilito, claro me deja operar libremente sobre la tabla niño, pero al volverlo a habilitar, para solo cambiar de estado el campo de este mismo nombre para solo activar o desactivar a un niño, al hacer el update de este campo en la tabla niño:

Código:
UPDATE nino SET estado='ACTIVO' WHERE id_nino= '0001'
me lanza este mensaje de error:

too many trigger records found for relation "nino"

por lo q no me deja volver a habilitar los triggers, para continuar haciendo lo q deseo/necesito.... la forma en q estoy deshabilitando y habilitando los triggers es:
Código:
//DESHABILITAR TRIGGERS

UPDATE pg_catalog.pg_class SET reltriggers = 0 WHERE oid = 'nino'::regclass

//HABILITAR TRIGGERS

UPDATE pg_catalog.pg_class SET reltriggers = 1 WHERE oid = 'nino'::regclass

como puedo solucionar este error amigos??? para q asi se me vuelvan a activar los triggers y me permitan solo actualizar el campo q necesito para q asi dichos triggers hagan su trabajo despues de esto???.... porfavor amigos.... ruego de su ayuda de verdad estoy contra el tiempo y agradeceria mucho su ayuda/guia..... de antemano gracias... bye
  #2 (permalink)  
Antiguo 26/07/2009, 18:33
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

Hola amigos, porfavolr rogaria alguna ayuda/guia para poder solucionar este problema, ya q he intentado pero nada, ademas al ejecutar :

UPDATE pg_catalog.pg_class SET reltriggers = 0 WHERE oid = 'nino'::regclass

UPDATE pg_catalog.pg_class SET reltriggers = 1 WHERE oid = 'nino'::regclass


para activar o desactivar los triggers, no me deja eliminar dichos triggers y me veo obligado a borrar la bd completa y volver a montarla :S porfavor amigos, que puedo hacer??? como deberia hacerlo para q no me envie ese error:

too many trigger records found for relation "nino"

porfavor ruego su ayuda amigos de verdad espero/necesito q me ayuden guien con respecto a este problema porfavor!!!!!.... de antemano gracias.... bye
  #3 (permalink)  
Antiguo 26/07/2009, 20:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

Rodrigo, por esa razón te recomendaba la ejecución de un unico trigger.

Tu problema está en entender muy bien el uso de las variables new y old para saber si el trigger será ejecutado para activar o desactivar un niño.

Por lo visto tienes 2 triggers, uno para activar y otro para desactivar y los dos se ejecutan al mimo evento. Dime el sistema como diferenciaría cual ejecutar?

revisa bien las variables new y old y acomodalas a tu problema y como te dije en un post anterior, todo se reduce a un simple if else end if;

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 26/07/2009, 23:02
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

Hola huesos gracias por tu respuesta, y si tengo dos triggers bueno tres estos son:
1- el q me actualiza el estado de la familia y de los padres, (los activa y los desactiva) y el otro es el q me activa o desactiva los restantes datos de niñocomo por ejemplo; salud, educacion trabajo etc... estos son mis dos trggers:

TRIGGER QUE ACTIVA O DESACTIVA FAMILIA, PADRE Y MADRE:
Código:
CREATE OR REPLACE FUNCTION cancelar_familia_antes_de_nino() returns TRIGGER AS
   
            $$
 
         DECLARE

       
   
            ninos record;
     
 
            padres record;
 
       
 
               
 
         
 
            BEGIN
 
       
 
            SELECT INTO ninos T1.IF AS id_familia, count(fxh.id_familia) AS numhijos FROM
 
       
 
            (SELECT id_familia AS IF FROM familia_x_hijos WHERE id_nino=new.id_nino)AS T1
 
       
 
            INNER JOIN familia_x_hijos fxh ON T1.IF = fxh.id_familia
 
       
 
            GROUP BY T1.IF;
  
           IF old.estado='ACTIVO' then
 
            UPDATE familia_x_hijos SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
       
        ELSEIF   old.estado='DESACTIVADO' then
             
          UPDATE familia_x_hijos SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
       
 
            IF ninos.numhijos = 1 then  
 
                IF old.estado='ACTIVO' then
 
              SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=id_familia;
 
       
 
              UPDATE familia SET estado = 'DESACTIVADO' WHERE id_familia=id_familia;
 
       
 
              UPDATE padre SET estado = 'DESACTIVADO' WHERE rut_padre=rut_padre;
 
       
 
              UPDATE madre  SET estado = 'DESACTIVADO' WHERE rut_madre=rut_madre;  


             ELSEIF   old.estado='DESACTIVADO' then

                


                  UPDATE familia SET estado = 'ACTIVO' WHERE id_familia=id_familia;
 
       
 
                  UPDATE padre SET estado = 'ACTIVO' WHERE rut_padre=rut_padre;
 
       
 
                  UPDATE madre  SET estado = 'ACTIVO' WHERE rut_madre=rut_madre; 

                  
 
 


            END IF;  
       
            END IF;            

            END IF;      
  
        
  
            RETURN new;
  
       end;
  
           
  
       
  
             
  
       
  
            $$
  
       
  
            LANGUAGE 'plpgsql';
  
       
  
            CREATE TRIGGER cancelar_familia_antes_de_nino before
  
       
  
               UPDATE ON nino
  
       
  
               FOR each row execute procedure cancelar_familia_antes_de_nino();
Y ESTE ES EL Q ME ACTIVA O DESACTIVA LOS RESTANTES DATOS DEL NIÑO (EDUCACION, SALUD, TRABAJO... ETC)
Código:
CREATE OR REPLACE FUNCTION cancelar_antes_de_nino() returns TRIGGER AS
  
      $$
   DECLARE
 
       
  
      ninos record;
  
      padres record;
  
         
   
      BEGIN
   
     SELECT INTO ninos id_nino FROM nino WHERE id_nino=NEW.id_nino;
       
 
     IF old.estado='ACTIVO' then

      UPDATE actividad SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE beneficio SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
  
      UPDATE educacion SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE nino_vive_en SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE salud SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE trabajo SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;

      UPDATE visita SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      
 
        ELSEIF   old.estado='DESACTIVADO' then
 

        UPDATE actividad SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE beneficio SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
  
      UPDATE educacion SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE nino_vive_en SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE salud SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE trabajo SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;

      UPDATE visita SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
       

      END IF;
  
      
      RETURN new;
  
      End;
  
       
 
      $$
 
      LANGUAGE 'plpgsql';
 
      CREATE TRIGGER cancelar_todo_antes_de_nino before
 
         UPDATE ON nino
 
         FOR each row execute procedure cancelar_antes_de_nino();
ahora mi pregunta es como deberia hacerlo para juntar ambos triggers en solo uno??? para q asi me funcione la activacion o desactivacion del trigger????? PORFAVOR amigos ruego su ayuda/guia para poder solucionar esto, ya q me tiene truncadicimo!!!! porfavor!!!!!..... de antemano gracias.... bye...

PD: sorry a todos en especial a huesos porla pasiencia, de verdad mi intension no es molestar ruego disculpen las molestias.
  #5 (permalink)  
Antiguo 27/07/2009, 06:52
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

Cita:
PD: sorry a todos en especial a huesos porla pasiencia, de verdad mi intension no es molestar ruego disculpen las molestias.
Rodrigo, no molestas, pero debes llegar con preguntas mas concretas.
Ya has tratado de unir los triggers?
Has analizado la secuencia de desactivación de las tablas cuando se dispara el trigger?
Para activación debe ser en el orden contrario.

Fijate que cuando se entra al trigger, después de extraer toda la información a las variables record, debe preguntarse si el niño se va a activar o a desactivar.

si se va a activar, debes ejecutar todo lo que se ejecuta en uno de los triggers. Si se va a desactivar, se debe hacer la operación contraria en el orden contrario.

Yo no lo he ensayado pero no veo que haya problemas. Intenta hacerlo y si tienes un problema diferente se puede mirar que está pasando.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 27/07/2009, 10:54
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

Hola huesos, perfecto gracias por tu ayuda ya los uni y me funcionan bien, ahora probare lo de activar y desactivar el trigger... cualquier cosa vuelvo a postear, pero aqui dejo el trigger q uni y me funciona perfecto.... lo dejo para q si a alguien le puede servir de ayuda.... :

Código:
CREATE OR REPLACE FUNCTION cancelar_familia_antes_de_nino() returns TRIGGER AS
   
            $$
 
         DECLARE

       
   
            ninos record;

            padres record;
 
            BEGIN
 
       
       
 
     IF old.estado='ACTIVO' then

      UPDATE actividad SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE beneficio SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
  
      UPDATE educacion SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE nino_vive_en SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE salud SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      UPDATE trabajo SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;

      UPDATE visita SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
      
 
        ELSEIF   old.estado='DESACTIVADO' then
 

        UPDATE actividad SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE beneficio SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
  
      UPDATE educacion SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE nino_vive_en SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE salud SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
 
      UPDATE trabajo SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;

      UPDATE visita SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
       

      END IF;




 
            SELECT INTO ninos T1.IF AS id_familia, count(fxh.id_familia) AS numhijos FROM
 
       
 
            (SELECT id_familia AS IF FROM familia_x_hijos WHERE id_nino=new.id_nino)AS T1
 
       
 
            INNER JOIN familia_x_hijos fxh ON T1.IF = fxh.id_familia
 
       
 
            GROUP BY T1.IF;
  
           IF old.estado='ACTIVO' then
 
            UPDATE familia_x_hijos SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
 
       
        ELSEIF   old.estado='DESACTIVADO' then
             
          UPDATE familia_x_hijos SET estado = 'ACTIVO' WHERE id_nino=NEW.id_nino;
       
 
            IF ninos.numhijos = 1 then  
 
                IF old.estado='ACTIVO' then
 
              SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=id_familia;
 
       
 
              UPDATE familia SET estado = 'DESACTIVADO' WHERE id_familia=id_familia;
 
       
 
              UPDATE padre SET estado = 'DESACTIVADO' WHERE rut_padre=rut_padre;
 
       
 
              UPDATE madre  SET estado = 'DESACTIVADO' WHERE rut_madre=rut_madre;  


             ELSEIF   old.estado='DESACTIVADO' then

                


                  UPDATE familia SET estado = 'ACTIVO' WHERE id_familia=id_familia;
 
       
 
                  UPDATE padre SET estado = 'ACTIVO' WHERE rut_padre=rut_padre;
 
       
 
                  UPDATE madre  SET estado = 'ACTIVO' WHERE rut_madre=rut_madre; 

                    
 
 


                  SELECT INTO ninos id_nino FROM nino WHERE id_nino=NEW.id_nino;



            END IF;  
       
            END IF;            

            END IF;      
  
        
  
            RETURN new;
  
       end;
  
           
  
       
  
             
  
       
  
            $$
  
       
  
            LANGUAGE 'plpgsql';
  
       
  
            CREATE TRIGGER cancelar_familia_antes_de_nino before
  
       
  
               UPDATE ON nino
  
       
  
               FOR each row execute procedure cancelar_familia_antes_de_nino();
ese es bueno cualquier cosa vuelvo a postear .... gracias nuevamente.... bye
  #7 (permalink)  
Antiguo 27/07/2009, 11:05
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

uffff, aca posteando nuevamente, probe lo de activar y desactivar el trigger... al desactivarlo no tengo problemas, pero al volver a activar el trigger y al cancelar o reintegrar a un niño me aparece este mensaje de error:

ERROR: too many trigger records found for relation "nino"
Estado SQL:XX000


por que me ocurre esto?? si ahora solo tengo un solo trigger q es el q me esta haciendo todo.... enm q estoy fallando???? de q manera debo hacerlo???.... porfavor amigos.... ya q al momento de volver a habilitar el trigger al ejecutar el update del campo estado en la tabla niño es ahi donde me lanza este error:

ERROR: too many trigger records found for relation "nino"
Estado SQL:XX000

porfavor amigos ruego... agradeceria mucho su ayuda/guia.... de antemano gracias... bye
  #8 (permalink)  
Antiguo 27/07/2009, 12:50
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problema al habilitar/deshabilitar triggers en postgre 8.2

Cita:
ERROR: too many trigger records found for relation "nino"
Definitivamente no has borrado los triggers

Como estas borrando los triggers?

mira esto
Código sql:
Ver original
  1. SELECT tgname FROM pg_catalog.pg_trigger;

Si todavia aparecen triggers relacionados con lo que has hecho, debes eliminarlos así:

Código sql:
Ver original
  1. DROP TRIGGER nombre_trigger ON tabla;
__________________
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 16:37.