Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Réflexions informatiques

Affecter automatiquement l'heure de modification d'un enregistrement (PostgreSQL/MySQL)

03/07/2021
Selon le SGBD, la façon d'affecter automatiquement la date et l'heure sur les lignes modifiées diffère.

Que ce soit sur MySQL ou PostgreSQL, c'est la fonction CURRENT_TIMESTAMP qui renvoie l'heure et la date actuelle. C'est d'ailleurs un synonyme de NOW(). La précision est de l'ordre de la seconde (mais sur PostgreSQL, elle peut être étendue à une précision plus élevée).

CURRENT_TIMESTAMP sur MySQL

La date/heure de dernière modification peut être paramétrée lors de la création de la table et du champ :

CREATE TABLE ma_table (
    date_derniere_modification TIMESTAMP
        DEFAULT CURRENT_TIMESTAMP
        ON UPDATE CURRENT_TIMESTAMP)

Le paramètre après DEFAULT indique la valeur à affecter lors de l'insertion avec INSERT.

Le paramètre après ON UPDATE indique la valeur à affecter lors de mise à jour avec UPDATE.

Le SGBD gère automatiquement s'il faut mettre à jour le champ : si un UPDATE ne modifie aucun champ de la ligne, le champ date_derniere_modification ne sera pas non plus modifié.

CURRENT_TIMESTAMP sur PostgreSQL

Sur PostgreSQL, il faudra avoir créé au préalable le champ en utilisant le type Timestamp :

CREATE TABLE ma_table (
    date_derniere_modification TIMESTAMP)

Puis passer par l'utilisation d'une procédure stockée, appelée depuis un déclencheur (Trigger).

La procédure stockée ci-dessous va définir le champ à modifier. J'ai volontairement précisé un schéma, afin que la procédure soit attachée à ce schéma et non partagée entre tous.

La 3ème ligne précise de ne faire de mise à jour de la date/heure qu'à partir du moment où l'une des nouvelles valeurs change.

CREATE OR REPLACE FUNCTION mon_schema.ma_fonction() RETURNS TRIGGER AS $$
BEGIN
    IF ROW(NEW.*) IS DISTINCT FROM ROW(OLD.*) THEN
        NEW.date_derniere_modification := CURRENT_TIMESTAMP;
        RETURN NEW;
     ELSE
        RETURN OLD;
     END IF;
END;
$$ LANGUAGE plpgsql ;

Ensuite, il faut définir le déclencheur et lui indiquer de lancer la fonction définie précédemment lorsqu'une table précise reçoit un certain événement.

L'événement peut être de type BEFORE ou AFTER croisé avec INSERT, UPDATE ou DELETE. Il est possible de préciser ces types en une seule fois, au moyen d'un OR.

Dans l'exemple ci-dessous, on demande à mettre à jour le champ avant tout INSERT ou UPDATE.

DROP TRIGGER IF EXISTS mon_trigger ON mon_schema.ma_table ;
CREATE TRIGGER mon_trigger
 BEFORE INSERT OR UPDATE
 ON mon_schema.ma_table
 FOR EACH ROW
 EXECUTE PROCEDURE mon_schema.ma_fonction();

A noter que la fonction peut être réutilisée pour actualiser d'autres tables , pour peu que celles-ci contiennent le même champ date_derniere_modification.

Dernière modification le 05/07/2021 - Quillevere.net

Rechercher sur le site

fr en rss RSS info Informations