Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/11/2011, 08:26
bastian_2008
 
Fecha de Ingreso: septiembre-2011
Ubicación: Bogota
Mensajes: 31
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: utilizar datos de un select para utilizarlos en un insert. PLPGSQL.

mira para eso estan las instruciones NEW y OLD. te voy a poner un ejemplo a ver si te sirve :)

este es el trigger
Código SQL:
Ver original
  1. CREATE TRIGGER vf_trigger_cuenta_estado BEFORE UPDATE
  2. ON public.vf_verificacion_venta FOR EACH ROW
  3. EXECUTE PROCEDURE public.vf_audit_cuenta_estado();

y este es el procedimiento que se ejecuta cada vez que hace un UPDATE:

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION public.vf_audit_cuenta_estado (
  2. )
  3. RETURNS TRIGGER AS
  4. $body$
  5. BEGIN
  6.    
  7.       IF (TG_OP = 'UPDATE') THEN
  8.      
  9.          IF(COALESCE(OLD.id_estado,0) <> NEW.id_estado OR COALESCE(OLD.observacion,'') <> NEW.observacion OR  COALESCE(OLD.id_solucion,0) <> NEW.id_solucion) THEN
  10.          
  11.              INSERT INTO vf_audit_cuenta_estado (audit_nrocuenta,audit_estado,audit_observacion,audit_solucion,audit_fecha,audit_usersys)
  12.                  SELECT NEW.nrocuenta,NEW.id_estado,NEW.observacion,NEW.id_solucion,now(),NEW.usersys ;                
  13.             RETURN NEW;
  14.           ELSEIF (TG_OP = 'DELETE') THEN
  15.                    RETURN NULL;
  16.         END IF;
  17.      END IF;
  18.      RETURN NEW;
  19. END;
  20. $body$
  21. LANGUAGE 'plpgsql'
  22. VOLATILE
  23. CALLED ON NULL INPUT
  24. SECURITY INVOKER
  25. COST 100;

lo que hace este procedimiento es al realizar una actualización sobre los 3 campos del primer IF, este va guardar ese cambio en otra tabla.

es decir las instrucciones NEW y OLD te permiten manipular lo que acabas de introducir(NEW) y lo que tenias antes de que hicieras el cambio con (OLD).

ELSE sirve para evitar que se eliminen registros de la tabla.

y el return NEW fuera de los if es para cuando se realiza una modificación en un campo diferente a los mencionados.


Espero que te sirva.......