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 originalCREATE TABLE cargo
(
id INTEGER NOT NULL,
nombe_cargo text,
CONSTRAINT pkcargo PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
CREATE TABLE empleado
(
id INTEGER NOT NULL,
nombre text,
cargo INTEGER,
CONSTRAINT pkempleado PRIMARY KEY (id),
CONSTRAINT fkcargo FOREIGN KEY (cargo)
REFERENCES cargo (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
Como ves, para insertar un empleado, es necesario un cargo registrado.
después creo la función del trigger
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION emp() RETURNS TRIGGER AS
$$
--DECLARE
--local usuario%ROWTYPE;
BEGIN
--select into local localidad from usuario where id=new.id_usuario;
INSERT INTO empleado VALUES(1,'prueba',NEW.id);
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
y el trigger
Código SQL:
Ver originalCREATE TRIGGER emp_cargo AFTER INSERT ON cargo FOR each ROW EXECUTE PROCEDURE emp();
Lo pruebo
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