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

ayuda con trigger postgresql

Estas en el tema de ayuda con trigger postgresql en el foro de PostgreSQL en Foros del Web. una pregunta.. si yo creo un trigger que se dispare luego de una insertar en una tabla xq no se inserta primero en la tabla ...
  #1 (permalink)  
Antiguo 24/10/2010, 03:30
 
Fecha de Ingreso: octubre-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
ayuda con trigger postgresql

una pregunta.. si yo creo un trigger que se dispare luego de una insertar en una tabla xq no se inserta primero en la tabla y despues se ejecuta?.. la funcion es la siguiente:

create or replace function venta () returns TRIGGER as $venta$
DECLARE
local usuario%ROWTYPE;
BEGIN
select into local localidad from usuario where id=new.id_usuario;
INSERT INTO venta VALUES(new.id_b,new.cedula,new.id_usuario,new.fech a,new.costo,local);
RETURN new;
END;
$venta$ language 'plpgsql';

el trigger es este:

create trigger venta AFTER insert on boleto for each row execute procedure venta();

mi inconveniente esta en que en la tabla venta, los primeros dos campos el id y la cedula son claves foraneas de la misma tabla boleto donde estoy aplicando el trigger.. si estoy diciendo que el trigger se dispare "AFTER insert on boleto" xq me da error de clave foranea en la tabla venta y nunk se logra insertar ni en boleto ni tampoco en venta...

gracias de antemano!! espero sus respuestas y opiniones...
  #2 (permalink)  
Antiguo 24/10/2010, 19:10
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: ayuda con trigger postgresql

No te niego que me pusiste a pensar y me dejaste la duda si esto pasaba en realidad.

Creo que tu confusión de llaves foraneas es mas un problema de diseño por que claramente esto no se presenta en postgresql.

Para probar lo que hiciste hice el siguiente ejemplo:

Código SQL:
Ver original
  1. CREATE TABLE cargo
  2. (
  3.   id INTEGER NOT NULL,
  4.   nombe_cargo text,
  5.   CONSTRAINT pkcargo PRIMARY KEY (id)
  6. )
  7. WITH (
  8.   OIDS=FALSE
  9. );
  10.  
  11. CREATE TABLE empleado
  12. (
  13.   id INTEGER NOT NULL,
  14.   nombre text,
  15.   cargo INTEGER,
  16.   CONSTRAINT pkempleado PRIMARY KEY (id),
  17.   CONSTRAINT fkcargo FOREIGN KEY (cargo)
  18.       REFERENCES cargo (id) MATCH SIMPLE
  19.       ON UPDATE NO ACTION ON DELETE NO ACTION
  20. )
  21. WITH (
  22.   OIDS=FALSE
  23. );

Como ves, para insertar un empleado, es necesario un cargo registrado.

después creo la función del trigger

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION emp() RETURNS TRIGGER AS
  2. $$
  3. --DECLARE
  4. --local usuario%ROWTYPE;
  5. BEGIN
  6. --select into local localidad from usuario where id=new.id_usuario;
  7. INSERT INTO empleado VALUES(1,'prueba',NEW.id);
  8. RETURN NEW;
  9. END;
  10. $$ LANGUAGE 'plpgsql';

y el trigger

Código SQL:
Ver original
  1. CREATE TRIGGER emp_cargo AFTER INSERT ON cargo FOR each ROW EXECUTE PROCEDURE emp();

Lo pruebo

Código SQL:
Ver original
  1. INSERT INTO cargo VALUES(1,'algo');

Efectivamente.... después de crearse el cargo, se ejecuta el trigger y me inserta bien el empleado.

si le pongo en el evento BEFORE me genera un problema de llave foranea.

revisa bien tus relaciones entre las tablas.

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

Etiquetas: trigger
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 02:30.