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.

Responder a