2014-04-03 15:40 GMT-03:00 Ing. Esneiker Enriquez Cabrera < eenriq...@cav.desoft.cu>:
> El código de la función es: > > > > ... > > > > Al ejecutar update carpeta_mensaje set eliminado = false el servidor me > retorna: > > > > 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 1 FROM ONLY "public"."nmusuario" x WHERE > "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x» > > sentencia SQL: «update carpeta_mensaje set nodo_terminal = false where id > in (select id_padre from carpeta_mensaje where eliminado is false and > id_padre is not null)» > > PL/pgSQL function "actualizar_carpeta_mensaje" line 14 at sentencia SQL > > sentencia SQL: «update carpeta_mensaje set nodo_terminal = false where id > in (select id_padre from carpeta_mensaje where eliminado is false and > id_padre is not null)» > > > > y esto una cantidad de veces exagerada. > > > > Espero que me puedan ayudar con este tema que aparentemente debería ser > una cuestión muy simple. > El error indica que tienes un problema de recursividad: haces un update sobre carpeta_mensaje que dispara la función trigger actualizar_carpeta_mensaje que hace un update sobre la tabla carpeta_mensaje que dispara el trigger actualizar_carpeta_mensaje que hace un update ... y así. Necesitas en tu función una condición de salida para cortar la recursividad. Por ejemplo: IF (TG_OP = 'INSERT') THEN if(NEW.id_padre is not null AND NEW.id_padre != OLD.id_padre) then update carpeta_mensaje set nodo_terminal = false where id = NEW.id_padre; update carpeta_mensaje set id_menu_padre = m.id_menu_padre from carpeta_mensaje m where m.id = NEW.id_padre and carpeta_mensaje.id = NEW.id; end if; END IF; Si id_padre no cambió entonces esto no se dispara y el trigger tiene una oportunidad de salir sin hacer cambios sobre su misma tabla. Esta misma lógica aplica a las otras condiciones que tienes en la función que luego disparan cambios sobre la misma tabla. Saludos, Fernando.