Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/10/2010, 19:10
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 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