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.