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:
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?
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.