web-dev-qa-db-fra.com

Appeler plusieurs fonctions de la gâchette?

Je cours PostgreSQL-9.2.4

Est-il possible d'appeler 2 fonctions d'un déclencheur?

Disons que j'ai deux fonctions pour deux tables différentes à exécuter si vous suivez les incendies de déclenchement:

déclencheur :

CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()

Fonction 1 : (lorsque la tâche commence => Supprimer toute tâche suivante attribuée précédemment pour ce système)

CREATE FUNCTION void_next_task() RETURNS trigger AS $$

BEGIN
  DELETE FROM tasks_status ts
  WHERE ts.system = NEW.system
  AND ts.event = 'next_task';
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql

Fonction 2 : (si une combinaison insérée de task et system déjà présenté dans le tableau => Marquez les enregistrements antérieurs avec cette combinaison comme deleted)

CREATE FUNCTION void_dup_task() RETURNS trigger AS $$

BEGIN
  UPDATE system_status ss
  SET deleted = 'TRUE'
  WHERE ss.system = NEW.system
  AND ss.task = NEW.task
  AND ss.deleted IS FALSE;
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql

J'ai donc fini par suivre des moyens de résoudre les moyens suivants:

  1. Avoir une gâchette qui appelle deux fonctions;
  2. Avoir une fonction qui effectue une mise à jour sur une table et supprimez une autre;
  3. Avoir deux mêmes déclencheurs et deux fonctions différentes;

Avant d'aller de l'avant et de mettre en œuvre la solution 3 Pourriez-vous me conseiller si Solution 1 ou alors 2 sont possibles du tout?

8
VL-80

Juste pour des raisons de complétude, il y a aussi le numéro 4 - faites des fonctions ordinaires, pas de déclenchement et les appelez à la fois (ou juste une seule, selon certaines conditions) de la fonction de déclenchement. Cela comporte plusieurs inconvénients: vous ne pouvez pas utiliser de nouvelles et anciennes dans des fonctions ordinaires et vous devez transmettre les données à vos fonctions, ce qui signifie encore plus de frais généraux que dans le cas 3. Dans votre cas, il n'y aurait pas de gain important pour cela. Le seul gain que je puisse imaginer est la lisibilité du code pour des fonctions de déclenchement très complexes.

Je l'ai fait pour une grande fonction fortement ramifiée (effectuez des contrôles et des mises à jour sur la table A, puis effectuez des autres mises à jour sur la table B, C ou D en fonction de la colonne A.1, après les mises à jour de B FAIRE quelque chose SIMILAT pour F ou G etc.); Et je me demande toujours si je devrais le garder divisé ou revenir à une seule fonction.

EDIT: Un autre cas lorsque cela est utile, c'est lorsque certaines parties du code sont partagées par plusieurs fonctions de déclenchement. Ensuite, il peut être utile d'écrire le code une seule fois et d'appeler la fonction au lieu d'écrire le code entier à nouveau. Encore une fois, cela ne vaut pas la peine pour quelques lignes de code comme dans votre cas.

2
Pavel V.