#1 Tue 25 August 2020 11:08
- Solène.Cottet
- Juste Inscrit !
- Date d'inscription: 20 Oct 2019
- Messages: 1
Creation Trigger sur PGAdmin
Bonjour,
J'essaie de créer mon premier trigger sur l'interface PGAdmin.
Ma BDD possède 2 couches de polygones, observation et site. Les observations sont incluses dans des sites.
Je cherche à réaliser un trigger qui, lorsqu'une observation est ajoutée, ajoute automatiquement le nom du site dans laquelle elle se trouve, à une colonne déjà existante (nom_site, jointe précédemment).
Je tâtonne un peu car je n'ai jamais réalisé ce genre de fonction.
Voici le code que j'ai écris :
Code:
CREATE TRIGGER update_observation BEFORE INSERT OR UPDATE ON observation FOR EACH ROW EXECUTE PROCEDURE update_nom_site_observation() CREATE OR REPLACE FUNCTION update_nom_site_observation() RETURNS TRIGGER AS BEGIN SELECT nom_site FROM site ; ON ST_Overlaps(observation.geom, site.geom) ; UPDATE observation(nom_site); END;
Je n'arrive pas à déceler où se trouve mon erreur, qui doit être une erreur de syntaxe.
L'execution me renvoit l'erreur suivante :
ERROR: ERREUR: erreur de syntaxe sur ou près de « CREATE »
LINE 4: CREATE OR REPLACE FUNCTION update_observation()
Merci d'avance pour votre aide
Hors ligne
#2 Tue 25 August 2020 12:47
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Creation Trigger sur PGAdmin
Bonjour,
Votre message d'erreur indique une erreur de syntaxe: il manque un ";" apres l'instruction create trigger...
Il faut d'abord définir la fonction du trigger, puis définir le trigger utilisant cette fonction.
Si on commence par définir le trigger, la fonction à laquelle on fait référence dans la commande (ici update_nom_site_observation) n'existe pas encore dans la BD => nouvelle erreur.
Ensuite, le code de la fonction du trigger n'est pas bon: dans un trigger, il faut référencer la ligne courante (FOR EACH ROW = la fonction est appelée pour chaque ligne du trigger) avec les variable NEW et OLD (https://www.postgresql.org/docs/12/plpgsql-trigger.html).
Attention aussi: vous mettez un ";" derriere chaque ligne sql dans le code de la fonction: il ne faut mettre un ";" qu'apres la fin du SQL complet.
qq chose comme:
Code:
BEGIN select s.nom_site from site s join observation o on st_overlaps(NEW.geom, o.geom) into NEW.nom_site; return NEW; END;
Enfin, attention à st_overlaps: ca renvoie faux si un objet est entièrement contenu dans un autre. il faut alors utiliser st_contains (ou st_within). (http://postgis.net/docs/ST_Overlaps.html)
Nicolas
Hors ligne
#3 Fri 28 August 2020 14:16
- tevrard
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 320
Re: Creation Trigger sur PGAdmin
Après si vous utilisez pgadmin, vous pouvez aussi passer par l'interface graphique pour faire vos triggers et fonctions de triggers
je trouve que c'est plutôt intuitif et pratique pour ma part
Hors ligne
#4 Tue 18 January 2022 11:43
- nath73
- Participant occasionnel
- Date d'inscription: 18 Sep 2008
- Messages: 27
Re: Creation Trigger sur PGAdmin
Bonjour,
je relance ce sujet car je n'arrive pas à créer une fonction trigger sur pgAdmin
Voici le code
Code:
CREATE FUNCTION sch_eid.eid_r_fosses_maj_base() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN IF TG_OP = 'INSERT' THEN NEW.base:= sch_eid.communes_integrees.base from sch_eid.communes_integrees where ST_within(NEW.geom, sch_eid.communes_integrees.geom); END IF; return NEW; END; $BODY$;
J'obtiens cette erreur ERREUR: erreur de syntaxe sur ou près de « BEGIN »
Même en simplifiant la requête j'ai tjs cette erreur sur le BEGIN
Merci de votre aide
Hors ligne
#5 Tue 18 January 2022 17:47
- Al3+
- Participant actif
- Lieu: Fécamp
- Date d'inscription: 5 Sep 2005
- Messages: 59
Re: Creation Trigger sur PGAdmin
Et en essayant de déplacer la clause LANGUAGE comme ça :
Code:
CREATE FUNCTION sch_eid.eid_r_fosses_maj_base() RETURNS trigger AS $BODY$ BEGIN IF TG_OP = 'INSERT' THEN NEW.base:= sch_eid.communes_integrees.base from sch_eid.communes_integrees where ST_within(NEW.geom, sch_eid.communes_integrees.geom); END IF; return NEW; END; $BODY$ LANGUAGE 'plpgsql';
Hors ligne
#6 Tue 18 January 2022 21:14
- nath73
- Participant occasionnel
- Date d'inscription: 18 Sep 2008
- Messages: 27
Re: Creation Trigger sur PGAdmin
pas mieux.
et même si je copie une fonction existante, j'ai le même message...
A n'y rien comprendre :-/
Hors ligne
#7 Wed 19 January 2022 08:44
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: Creation Trigger sur PGAdmin
Bonjour,
L'extension plpgsql est-elle bien présente sur votre base ?
Hors ligne
#8 Wed 19 January 2022 08:53
- Al3+
- Participant actif
- Lieu: Fécamp
- Date d'inscription: 5 Sep 2005
- Messages: 59
Re: Creation Trigger sur PGAdmin
Désolé, je ne vois pas d'erreur. J'ai même testé votre code sur ma base en remplaçant le nom du schéma évidemment : requête exécutée avec succès...
Voici éventuellement pour info ce que produit le générateur de scripts en retour :
NB : il faut bien entendu remplacer le schéma public par le vôtre sch_eid et xxx par le propriétaire de la base.
Code:
-- FUNCTION: public.eid_r_fosses_maj_base() -- DROP FUNCTION public.eid_r_fosses_maj_base(); CREATE FUNCTION public.eid_r_fosses_maj_base() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF AS $BODY$ BEGIN IF TG_OP = 'INSERT' THEN NEW.base:= public.communes_integrees.base from public.communes_integrees where ST_within(NEW.geom, public.communes_integrees.geom); END IF; return NEW; END; $BODY$; ALTER FUNCTION public.eid_r_fosses_maj_base() OWNER TO "xxx";
Hors ligne
#9 Fri 21 January 2022 09:14
- nath73
- Participant occasionnel
- Date d'inscription: 18 Sep 2008
- Messages: 27
Re: Creation Trigger sur PGAdmin
Bonjour,
Oui elle est installée. Est-ce que sa définition est bonne ?
Code:
CREATE EXTENSION plpgsql SCHEMA pg_catalog VERSION "1.0";
Hors ligne
#10 Fri 21 January 2022 09:18
- nath73
- Participant occasionnel
- Date d'inscription: 18 Sep 2008
- Messages: 27
Re: Creation Trigger sur PGAdmin
Re-bonjour,
Ce matin ça a fonctionné ! ... Incompréhensible
Merci à tous
Hors ligne