Vous n'êtes pas identifié(e).
J'ai écris un trigger qui maj un nouvel enregistrement de la table initiale.
CREATE OR REPLACE FUNCTION update() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
_idn INTEGER;
BEGIN
SELECT id INTO _idn FROM table WHERE ...;
IF ( _idn > 0 ) THEN
UPDATE my_table SET ... WHERE id=_idn;
END IF;
RETURN NULL;
END
$$;
CREATE TRIGGER my_trigger
AFTER UPDATE
ON my_table
FOR EACH ROW
EXECUTE PROCEDURE update();
Quand je mets à jour le premier energistremnt, le trigger cherche à maj tous les enregistrements concernés et j'obtiens l'erreur "stack depth limit exceeded"
Augmenter cette limite n'est pas une solution, ma table est amener à grossir.
Mais I j'ai jamais besoin de maj le premier enregistrement et je souhaite simplement limiter le nombre de boucles du trigger.
Je ne sais pas comment gérer un compteur de boucles et je n'ai rien trouvé qui me permette de lire l'usage réelle de la pile, ce qui serait une autre solution.
Toute idée est la bienvenue.
Merci d'avance.
Dernière modification par PmGs7 (25/07/2022 12:15:26)
Hors ligne
Une des possibilités est d'utiliser la fonction pg_trigger_depth() (https://www.postgresql.org/docs/14/functions-info.html). Si on peut garantir que ce trigger ne peut pas être déclenché par un autre trigger que par lui-même, ça suffit (ça a toujours été le cas pour moi).
Sinon, si on ne peut pas garantir ça, je pense qu'il faut utiliser https://www.postgresql.org/docs/current … CALL-STACK , et analyser la pile d'appel pour savoir si le trigger a été appelé par lui-même. Mais c'est sale, c'est de l'analyse de chaîne de caractères…
Marc.
Hors ligne
Merci pour pg_trigger_depth() , je ne connaissais pas, c'est exactement ce qu'il me faut.
Dernière modification par PmGs7 (25/07/2022 12:15:41)
Hors ligne
Attention quand même, si ce trigger peut être déclenché par un autre trigger (par exemple parce qu'un autre trigger peut mettre à jour cette table), pg_trigger_depth() ne va pas faire ce que vous espérez. C'est la profondeur totale de triggers, pas le nombre d'appels récursifs de ce trigger seulement.
Marc.
Hors ligne
Merci beaucoup ! Je vais faire attention maintenant!
Dernière modification par JulietteLebel (04/08/2022 12:16:39)
Hors ligne