2014-04-03 15:40 GMT-03:00 Ing. Esneiker Enriquez Cabrera <
[email protected]>:
> 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.