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.: eenriq...@cav.desoft.cu De: pgsql-es-ayuda-ow...@postgresql.org [mailto:pgsql-es-ayuda-ow...@postgresql.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 <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 <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