Google+ Followers

woensdag 28 oktober 2015

Echte wereld PostgreSQL trigger recursie

Elke zoveel tijd kom je in de situatie waarin een trigger op een tabel een update moet doen van de tabel zelf. Gevolg: de trigger triggert zichzelf en de boel komt in een oneindige lus.

Gelukkig is daar pg_trigger_depth(), die simpelweg de waarde nul heeft als de trigger afgaat door een direct query op de tabel. Als de trigger wordt aangeroepen door een actie die is veroorzaakt door een trigger, dan wordt pg_trigger_depth() verhoogd met de nesting van de triggers.

Deze controle kun je in een WHEN clausule zetten zodat de hele trigger alleen wordt uitgevoerd als pg_trigger_depth() daadwerkelijk nul is:

CREATE TRIGGER trg_product_update
  BEFORE UPDATE
  ON table_x FOR EACH ROW
  WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE trigger_function_foo();

Als de procedure 'trigger_function_foo()' een update op table_x veroorzaakt dan is pg_trigger_depth() niet meer nul en doet de trigger niets. Recursie getopt.