RE: duda sobre trigger

From: "Ing(dot) Esneiker Enriquez Cabrera" <eenriquez(at)cav(dot)desoft(dot)cu>
To: "'Fernando Hevia'" <fhevia(at)gmail(dot)com>
Cc: "'POSTGRES'" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: duda sobre trigger
Date: 2014-04-03 19:14:42
Message-ID: 003e01cf4f70$f7d226b0$e7767410$@desoft.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Muchas gracias, no me había dado cuenta de ese detalle.

Saludos,

Ing. Esneiker Enriquez Cabrera
Esp. B en Ciencias Informáticas

Desoft en Ciego de Ávila. Joaquín de Aguero esq. Calle 2. Ciego de Ávila.
Cuba.
Telf.: 53 33 22 8971, email.: eenriquez(at)cav(dot)desoft(dot)cu

De: pgsql-es-ayuda-owner(at)postgresql(dot)org
[mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Fernando Hevia
Enviado el: jueves, 03 de abril de 2014 15:04
Para: Ing. Esneiker Enriquez Cabrera
CC: POSTGRES
Asunto: Re: [pgsql-es-ayuda] duda sobre trigger

2014-04-03 15:40 GMT-03:00 Ing. Esneiker Enriquez Cabrera
<eenriquez(at)cav(dot)desoft(dot)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 <http://m.id/> = NEW.id_padre and
carpeta_mensaje.id <http://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.

__________ Información de ESET NOD32 Antivirus, versión de la base de firmas
de virus 9621 (20140401) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Angelo Astorga 2014-04-03 19:21:40 Desarrollador !!!
Previous Message Gilberto Castillo 2014-04-03 19:07:41 Re: duda sobre trigger