El código de la función es:

 

CREATE OR REPLACE FUNCTION actualizar_carpeta_mensaje()

  RETURNS trigger AS

$BODY$

BEGIN

  

  IF (TG_OP = 'DELETE') THEN

    update carpeta_mensaje set nodo_terminal = true where id = OLD.id_padre
and id not in (select id_padre from carpeta_mensaje where eliminado is false
and id_padre is not null);

  END IF;

 

  IF (TG_OP = 'UPDATE') THEN

    if (NEW.eliminado IS TRUE) then

     update carpeta_mensaje set nodo_terminal = true where id in (select
id_padre from carpeta_mensaje where eliminado is true and id_padre is not
null);

    end if;

    if (NEW.eliminado IS FALSE) then

     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);

    end if;

  END IF;

 

  IF (TG_OP = 'INSERT') THEN

    if(NEW.id_padre is not null) 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;

  

  RETURN NEW;

END;

$BODY$

  LANGUAGE plpgsql VOLATILE

  COST 100;

ALTER FUNCTION actualizar_carpeta_mensaje()

  OWNER TO postgres;

 

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.

 

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: Ing. Esneiker Enriquez Cabrera [mailto:eenriq...@cav.desoft.cu] 
Enviado el: jueves, 03 de abril de 2014 13:54
Para: 'POSTGRES'
Asunto: duda sobre trigger

 

Hola a todos.

Cómo puedo en un trigger preguntar si se modificó una columna específica de
una tabla? Por ejemplo si se  modificó la columna stock. En la documentación
de los trigger no lo encuentro.

Muchas gracias

 

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

 



__________ 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

Responder a