banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB