#1 Tue 29 January 2019 14:58
- hugues
- Participant occasionnel
- Lieu: Fontenay-aux-Roses
- Date d'inscription: 6 Sep 2005
- Messages: 30
Stocker Date de modification Attribut Postgresql
Bonjour,
Je ne suis pas spécialiste Postgres et bloque sur une fonction qui n'a pourtant pas l'air si compliquée.
J'ai une table géo qui contient plusieurs champs dont un champ date_modif.
L'incrémenter avec la date de création d'une entité n'est pas un problème mais j'aimerais l'incrémenter avec la date de dernière modification, notamment attributaire.
A priori il faut passer par l'intermédiaire d'une création de fonction/trigger mais je ne maîtrise pas le principe de mise en place.
Une âme charitable pour m'en dire un peu plus?
Un grand merci d'avance
Hugues
Hors ligne
#2 Tue 29 January 2019 22:24
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Stocker Date de modification Attribut Postgresql
Créer un trigger requiert deux choses, créer la fonction exécutée,
et définir quand celle-ci se déclenche et de quelle manière.
La déclaration du trigger spécifie la table sur laquelle celui ci s’exécute,
quel action est concernée (INSERT, UPDATE, DELETE) ainsi que le moment,
avant, en remplacement ou après, celui se déroule.
L'ordre des événements lors d'une action est le suivant :
1: REQUETE UPDATE/INSERT/DELETE OU TRIGGER INSTEAD OF
2: TRIGGER BEFORE
3: VALIDATION DE LA (OU DES) LIGNES ET ECRITURE
4: TRIGGER AFTER
On peut restreindre les colonnes à surveiller quand on définit un TRIGGER sur une mise à jour,
avec la possibilité de définir une condition à son exécution.
On peut choisir si le trigger se lance une seule fois après une requête, ou pour chaque ligne
concernée par une requête.
Dans la fonction de trigger
quand le trigger s’exécute pour chaque ligne, on a notre disposition
les variables OLD et NEW qui représentent respectivement
la ligne courante avant et et après mise à jour, elles ne sont cependant
disponible que suivant le moment de déclenchement
(OLD est indisponible dans un trigger se passant avant une insertion par exemple).
Quand le trigger se déclenche avant une action, la ligne qui sera
validée et écrite sur disque (étape 3) sera celle retournée par la fonction avec
le mot clef RETURN.
Le code est de ce genre :
Code:
CREATE OR REPLACE FUNCTION log_change_on_ma_table_func() RETURNS TRIGGER AS $$ BEGIN NEW.date_modif = NOW(); --la fonction NOW() donne l'heure actuelle du serveur. RETURN NEW; END; $$ LANGUAGE plpgsql ; CREATE TRIGGER log_change_on_ma_table BEFORE UPDATE ON ma_table -- le trigger se déclenche avant la mise à jour de la table FOR EACH ROW -- on veut que le trigger se déclenche pour chaque ligne modifiée par une requête EXECUTE PROCEDURE log_change_on_ma_table_func() ;
Dernière modification par tumasgiu (Tue 29 January 2019 22:31)
Hors ligne