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.
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 |