Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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: 1534

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: 319

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: 26

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: 50

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';

En ligne

 

#6 Tue 18 January 2022 21:14

nath73
Participant occasionnel
Date d'inscription: 18 Sep 2008
Messages: 26

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: 95

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: 50

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";

En ligne

 

#9 Fri 21 January 2022 09:14

nath73
Participant occasionnel
Date d'inscription: 18 Sep 2008
Messages: 26

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: 26

Re: Creation Trigger sur PGAdmin

Re-bonjour,
Ce matin ça a fonctionné ! ... Incompréhensible
Merci à tous

Hors ligne

 

Pied de page des forums

Powered by FluxBB