HOla Osmany, has intentado colocar el return null; luego de cada insert
(para salir de la función) y creo que eso puede evitar que se inserte
recursivamente.
pues al final veo un return new;
algo como:
CASE WHEN arol like 'periodista' THEN
INSERT INTO personal.periodista(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
return null;
Saludos
On 11/12/17 11:23, Ing.Informatico Osmany Rodriguez Duran wrote:
Acudo una ves mas a su ayuda porque no logro eliminar el error de mi
código y por mas q lo reviso
no encuentro la solución ya lo he hecho de diversas formas y me sigue
dando el mismo error y lo he probado
en varias pc con varios postgres pero da el mismo error y sería una
pena no poder hacer esa función ya q es bastante
importante en mi proyecto le explico un poco como funciona; tengo
varias tablas que heredan de una con la misma estructura todas y
tengo una funcion que trigger que se dispara cuando se va a insertar
en la tabla madre 'user' donde pregunto que rol es el del user y en
caso de
ser uno de los roles que participan en el proceso de publicacion
entonces se inserta en la tabla hija correspondiente al rol, de lo
contrario se inserta en la tabla madre.
este es el trigger:
CREATE TRIGGER insertar_rol
BEFORE INSERT
ON security.users
FOR EACH ROW
EXECUTE PROCEDURE security.rol_insert2();
esta es la funcion trigger:
-- Function: security.rol_insert()
-- DROP FUNCTION security.rol_insert();
CREATE OR REPLACE FUNCTION security.rol_insert2()
RETURNS trigger AS
$BODY$
DECLARE
arol varchar;
BEGIN
SELECT rol into arol FROM security.rol where id= NEW.rol_id;
CASE WHEN arol like 'periodista' THEN
INSERT INTO personal.periodista(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
WHEN arol like 'corrector' THEN
INSERT INTO personal.corrector(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
WHEN arol like 'director' THEN
INSERT INTO personal.director(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
WHEN arol like 'disennador' THEN
INSERT INTO personal.disennador(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
WHEN arol like 'fotografo' THEN
INSERT INTO personal.fotografo(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
WHEN arol like 'jefe_informacion' THEN
INSERT INTO personal.jefe_informacion(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
WHEN arol like 'jefe_redaccion' THEN
INSERT INTO personal.jefe_redaccion(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
ELSE
INSERT INTO security.users(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen);
END CASE;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
y este es el triste error:
ERROR: límite de profundidad de stack alcanzado
HINT: Incremente el parámetro de configuración «max_stack_depth»
(actualmente 2048kB), después de asegurarse que el límite de
profundidad de stack de la plataforma es adecuado.
CONTEXT: sentencia SQL: «SELECT rol FROM security.rol
where id= NEW.rol_id»
función PL/pgSQL security.rol_insert2() en la línea 5 en sentencia SQL
sentencia SQL: «INSERT INTO security.users(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen)»
función PL/pgSQL security.rol_insert2() en la línea 44 en sentencia SQL
sentencia SQL: «INSERT INTO security.users(
id, username, nombre, pass, ci, ultimav, rol_id, edad,
sexo_id,correo, is_active, imagen)
VALUES (default, NEW.username,NEW.nombre, NEW.pass, NEW.ci,
NEW.ultimav, NEW.rol_id, NEW.edad, NEW.sexo_id,NEW.correo,
NEW.is_active, NEW.imagen)»
función PL/pgSQL security.rol_insert2() en la línea 44 en sentencia SQL
este error se hace cíclico y se repite una y otra ves, aclarar q
cuando lo hice por primera ves me inserto todo muy bien para ser
exacto los primeros 6 roles los inserto bien
de ahí en adelante empezó a dar error he hecho casi de todo hasta
donde me permite mi conocimiento pero nada no logro nada más que
frustrarme, espero
logren entender un poco cual es la idea de lo deseo hacer y puedan
ayudarme muchas gracias de antemano.....
--
Ing. en Informática Osmany Rodríguez Durán
Universidad Jesús Montané Oropesa Isla de la Juventud
Evento Universidad 2018. Conozca todos los detalles en
http://universidad2018.uij.edu.cu