Ver Mensaje Individual
  #16 (permalink)  
Antiguo 21/07/2009, 15:55
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Como auditar tablas en Postgre 8.2

Ya vi que tratabas de hacer. Ya entendí rl porque anteponias las palabras padres y ninos.

Prueba este trigger.

Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION cancelar_familia_antes_de_nino() RETURNS TRIGGER AS
  2.  
  3.       $$
  4.    DECLARE
  5.  
  6.        
  7.  
  8.       ninos record;
  9.  
  10.       padres record;
  11.  
  12.          
  13.    
  14.       BEGIN
  15.        
  16.  
  17.       SELECT INTO ninos T1.IF AS id_familia, COUNT(fxh.id_familia) AS numhijos FROM
  18.  
  19.       (SELECT id_familia AS IF FROM familia_x_hijos WHERE id_nino=NEW.id_nino)AS T1
  20.  
  21.       INNER JOIN familia_x_hijos fxh ON T1.IF = fxh.id_familia
  22.  
  23.       GROUP BY T1.IF;
  24.  
  25.       UPDATE familia_x_hijos SET estado = 'DESACTIVADO' WHERE id_nino=NEW.id_nino;
  26.  
  27.        
  28.  
  29.       IF ninos.numhijos = 1 THEN  
  30.  
  31.         SELECT INTO padres rut_padre,rut_madre FROM familia WHERE id_familia=ninos.id_familia;
  32.  
  33.         UPDATE familia SET estado = 'DESACTIVADO' WHERE id_familia=ninos.id_familia;
  34.  
  35.         UPDATE padre SET estado = 'DESACTIVADO' WHERE rut_padre=padres.rut_padre;
  36.  
  37.         UPDATE madre  SET estado = 'DESACTIVADO' WHERE rut_madre=padres.rut_madre;  
  38.  
  39.       END IF;      
  40.  
  41.       RETURN NEW;
  42.  
  43.       END;
  44.  
  45.        
  46.  
  47.       $$
  48.  
  49.       LANGUAGE 'plpgsql';
  50.  
  51.       CREATE TRIGGER cancelar_familia_antes_de_nino BEFORE
  52.  
  53.          UPDATE ON nino
  54.  
  55.          FOR each ROW EXECUTE PROCEDURE cancelar_familia_antes_de_nino();

Cita:
en q estoy fallando ahora amigos??? porfavor de verdad ruego su ayuda amigos!!!... de antemano gracias.... bye
Rodrigo
Me tomaré unos minutos para explicarte el funcionamiento de las variables record y cual es su utilidad dentro de una función o procedimiento almacenado. Cualquier duda, puedes preguntar nuevamente.

Un trigger se define como un disparador de eventos y es posible acceder a las variables que son ejecutadas en cada sentencia. Por ejemplo estamos hablando de una tabla nino y cuando se inserta en dicha tabla se puede jugar con los valores new.atributo y old.atributo dependiendo del caso.

Para tu caso, es necesario tener otras variables con base en el id_nino, como lo son rut_padre y rut_madre. Como estas variables no son proporcionadas por el evento disparado, es necesario recurrir a las variables record para obtener sus valores. Sin embargo, estas ya no son variables que tienen los atributos new y old para su manipulación. Por esta razón el trigger debe quedar así.

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