I possède une table a
avec trois déclencheurs qui insèrent, mettre à jour ou supprimer des lignes correspondantes dans b
chaque fois une rangée dans a
est inséré, mis à jour ou supprimés. Tous les 3 déclencheurs utilisent la même fonction de déclenchement p
.jointures autour if pour la fonction de déclenchement PostgreSQL
CREATE OR REPLACE FUNCTION p()
RETURNS TRIGGER
AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
-- INSERT INTO b ...
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
-- UPDATE b ...
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
-- DELETE FROM b ...
RETURN NEW;
ELSE
RETURN NULL;
END IF;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER i AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE p();
CREATE TRIGGER u AFTER UPDATE ON a FOR EACH ROW EXECUTE PROCEDURE p();
CREATE TRIGGER d AFTER DELETE ON a FOR EACH ROW EXECUTE PROCEDURE p();
a
a aussi une clé étrangère a1
dans c
(avec c1
clé primaire), et je voudrais modifier p
de telle sorte qu'il entre dans les IF
/ELSIF
branches en fonction également sur une colonne c2
dans c
: si cette colonne jointe a été modifiée, entrez les branches INSERT
et UPDATE
; s'il reste le même, entrez la branche UPDATE
. En effet, quelque chose comme ceci:
IF (TG_OP = 'INSERT') OR ((TG_OP = 'UPDATE') AND (oldC.c2 <> newC.c2)) THEN
-- ...
ELSIF (TG_OP = 'UPDATE') OR (oldC.c2 = newC.c2) THEN
-- ...
ELSIF (TG_OP = 'DELETE') OR ((TG_OP = 'UPDATE') AND (oldC.c2 <> newC.c2)) THEN
-- ...
ELSE
-- ...
END IF;
où oldC
et newC
résulterait de jointures similaires à ceux-ci (avec la syntaxe environ.):
SELECT oldC.* FROM a, c AS oldC WHERE OLD.a1 = c.c1;
SELECT newC.* FROM a, c AS newC WHERE NEW.a1 = c.c1;
donc ce qui est nécessaire en vigueur sont deux jointures en dehors de la IF
, ce qui lui permettrait de se référer à oldC
et newC
(ou quelque chose d'analogue). Est-ce possible et quelle serait la version modifiée de p
(avec une syntaxe PostgreSQL correcte)?
+1 Est-il exact de supposer que je dois placer un déclencheur/utre sur 'C' pour la première interprétation (» en fonction d'une colonne c2 dans c: si cette colonne jointe a changé ")? – Drux
@Drux: Oui, pour surveiller les changements dans 'c.c2', vous avez besoin d'un trigger sur' c'. Attention à ne pas créer de boucles infinies avec trop de déclencheurs. Parfois, les requêtes combinées utilisant des CTE modificateurs de données constituent une bonne alternative. [Exemple.] (Http://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres/20561627#20561627) –