PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 25/07/2022 11:16:27

PmGs7
Membre

Résolu - Comment limiter le nombre d'exécution d'un trigger?

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

#2 25/07/2022 11:38:46

Marc Cousin
Membre

Re : Résolu - Comment limiter le nombre d'exécution d'un trigger?

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

#3 25/07/2022 11:46:19

PmGs7
Membre

Re : Résolu - Comment limiter le nombre d'exécution d'un trigger?

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

#4 25/07/2022 13:41:49

Marc Cousin
Membre

Re : Résolu - Comment limiter le nombre d'exécution d'un trigger?

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

#5 04/08/2022 12:16:28

JulietteLebel
Membre

Re : Résolu - Comment limiter le nombre d'exécution d'un trigger?

Merci beaucoup ! Je vais faire attention maintenant!

Dernière modification par JulietteLebel (04/08/2022 12:16:39)

Hors ligne

Pied de page des forums