Pas à pas : création d'un trigger
Dans la base stageXX (remplaçer XX par votre numéro de stagiaire), créer la table zonage dans le schema travail, avec les spécifications suivantes
gid | serial not null (pk) |
libelle | varchar(50) |
surface_km2 | float |
geom | geometry(polygon,2154) |
Sous PgAdmin taper :
CREATE TABLE travail.zonage (gid SERIAL NOT NULL PRIMARY KEY, libelle VARCHAR(50), surface_km2 FLOAT, geom geometry(polygon, 2154))
Nous souhaitons créer un trigger qui renseigne le champ surface_km2 et mette en majuscule le libelle à chaque insertion ou modification d'une donnée de la table.
On trouvera ici une description de l'utilisation de psql pour les triggers.
On retiendra en particulier l'existence des variables de type RECORD (enregistrement):
NEW : contenant la nouvelle ligne de la base de données dans les triggers de niveau ligne (FOR EACH ROW). Elle est NULL dans un déclencheur de niveau instruction.
OLD : contenant l'ancienne ligne de la base de données pour UPDATE ou DELETE. Elle est NULL dans un déclencheur de niveau instruction.
La fonction peut retourner NULL ce qui annulera l'insertion, la mise à jour ou la suppression de l'enregistrement ou OLD ou NEW ce qui validera la modification, l'ajout ou la suppression.
sous PgAdmin taper :
CREATE OR REPLACE FUNCTION travail.maj_zonage()
RETURNS "trigger" AS
$BODY$
BEGIN
NEW.surface_km2:= (ST_Area(NEW.geom)*0.000001);
NEW.libelle = UPPER(NEW.libelle);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
Conseil :
Une astuce consiste à écrire systématiquement CREATE or REPLACE
pour recharger rapidement la fonction en cas de changement du code.
taper maintenant :
CREATE TRIGGER maj_surface BEFORE INSERT OR UPDATE
ON travail.zonage
FOR EACH ROW
EXECUTE PROCEDURE travail.maj_zonage();
Constater que le déclencheur apparaît maintenant dans l'onglet info de la table travail.zonage sous DbManager dans QGIS (ou il peut être activé ou désactivé).

Sous QGIS ajouter la table travail.zonage dans le canevas, passer en mode modification et saisir des polygones sans renseigner surface_km2 et en tapant un libelle en minuscule. Enregistrer et constater les changements dans la table des attributs.