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

Printemps des cartes 2024

#1 Sat 07 September 2013 15:30

diophamidou
Participant assidu
Date d'inscription: 18 Jan 2006
Messages: 243

Création d'un trigger postgres

Bonjour, J'ai 2 tables sous postgres une table zonage et une autre table que j'appelle t2c .La table tc2 contient toutes les informations que je souhaiterais récupérer dans la table zonage.
L'objectif c'est que dès qu'on numérise un polygone on renseigne seulement le champ libelle qui sert d'identifiant. L'ensemble des autres champs seront renseignés par une fonction trigger. Cette fonction simplement sans trigger fonctionne bien (voir pj).Je souhaite convertir cette fonction normale en fonction trigger pour que celle-ci se déclenche à chaque insertion d'objet. Ce qui m'éviterait de lancer la fonction à chaque fois.
j'ai le message d'erreur que vous trouverez en pj avec les différents fonction créées.

je ne suis débutant sur les procédures stockées de postgres, auriez-vous une idée de ce qui ne marche pas das ma procédure.

Dernière modification par diophamidou (Sat 07 September 2013 15:44)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Sat 07 September 2013 18:14

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: Création d'un trigger postgres

Bonjour,

ce sujet a été déplacé dans le forum approprié.

Hors ligne

 

#3 Sun 08 September 2013 04:07

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: Création d'un trigger postgres

Bonjour,
Je ne suis pas non plus un as des triggers et ignore si la fonction update peut être utilisée de la sorte mais si tel est le cas, je me demande si les champs affublés de new ne devraient pas plutôt être à gauche de égal (smile soit

Code:

Begin
update  urba.n_zone_urba_76010_076
set (new.idurba,new.liblong, new.typezone, new.destdomi, new.insee, new.datappro, new.datvalid)=(idurba, liblong, typezone, destdomi, insee, datappro,datvalid)
from t2c where new.libelle=t2c.libelle;
return new;
End;

En fait, quand vous utilisez un trigger insert for each row, Postgresql attribue l'appellation new à la nouvelle entité qui est en cours de création; n_zone_urba_76010_076 devient donc ici new . http://docs.postgresql.fr/9.2/plpgsql-trigger.html C'est donc cette valeur que vous essayez de mettre à jour d'où le fait qu'il doit être du côté du SET. Ce pour quoi postgresql estime qu'il y a une ambiguité sur le champ new.idurba.
En outre, je n'ai pas compris pourquoi vous ne sélectionnez pas directement depuis la table t2c mais faites une sélection préalable des mêmes champs. J'ai donc enlevé cette partie.
PS: je ne pense même pas que l'option new soit obligatoire dans la fonction vu que la mise à jour se fait par défaut sur la ligne en entrée, mais bon...

Hors ligne

 

#4 Sun 08 September 2013 11:01

diophamidou
Participant assidu
Date d'inscription: 18 Jan 2006
Messages: 243

Re: Création d'un trigger postgres

Merci pour cette précieuse aide. Effectivement je n'avais pas besoin de réécrire le new.
Le trigger fonctionne à un détail prés, il me faut ajouter 2 objets pour voir le premier objet se mettre à jour.
Est ce normal ? je ne pense pas mais je sèche. Auriez-vous une idée?
Merci encore

Hors ligne

 

#5 Sun 08 September 2013 15:41

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: Création d'un trigger postgres

Bonjour,
Non, a priori, ce n'est pas normal ou en tout cas, ce n'est pas ce qu'on en attend !!! Donc, il y a des trucs à revoir smile
il n'y a pas d'autre trigger en exécution sur cette table? Votre trigger, il est bien défini before insert et for each row?

Le trigger fonctionne à un détail prés, il me faut ajouter 2 objets pour voir le premier objet se mettre à jour.


Le second aussi se met à jour ou est-ce juste le premier qui est mis à jour? Et si vous ajoutez plus d'objets, comment ça réagit?

Et si vous mainteniez le new dans la requête pour voir?

Hors ligne

 

#6 Mon 09 September 2013 09:30

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Création d'un trigger postgres

Bonjour.
Je ne maîtrise pas très bien le trigger mais je constate que le votre est lancé "before insert" donc avant chaque évènement, ce qui devrait expliqué la nécessité de faire une 2ème ajout pour que le premier soit pris en compte. Passer le trigger en after insert devrait corriger le tir !
Cordialement
JPL

Hors ligne

 

#7 Mon 09 September 2013 21:53

diophamidou
Participant assidu
Date d'inscription: 18 Jan 2006
Messages: 243

Re: Création d'un trigger postgres

Bonsoir, Merci à SANTANNA et JP LLORENS pour votre précieuse aide, le trigger marche à merveille et la mise à jour se fait automatiquement après le remplacement de BEFORE par AFTER dans le trigger.
Encore merci beaucoup et très bonne soirée.

Hors ligne

 

#8 Tue 10 September 2013 10:23

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: Création d'un trigger postgres

Bonjour,
cool alors!
Par contre, j'aimerais bien que les "triggers-man" m'expliquent, s'ils le veulent bien, pourquoi le trigger doit être en after. Est-ce à cause de la fonction update qui est appelée et qui requiert l'existence préalable de la donnée dans la table?
Je pose la question car je fais des remplissages de champs automatisés comme Diophamidou (en fonction d'un champ ou d'une localisation, on récupère d'autres infos dans d'autres tables); et chez moi ça marche avec un trigger before. La différence dans nos fonctions est que j'utilise plutôt des "select into" ou "insert into".
Merci d'avance de bien vouloir étancher ma soif de curiosité...

Hors ligne

 

#9 Tue 10 September 2013 11:48

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: Création d'un trigger postgres

Bonjour,

Oui c'est exactement ca: pour la mise à jour d'une autre table depuis un trigger sur une table, il faut que la table en question ait ete mise à jour avant qu'on puisse propager le changement.

Un trigger peut être défini au niveau du statement (la requête elle-meme, trigger appelé une seule fois pour la requête) ou au niveau de la ligne (trigger appelé pour chaque ligne concernée par la requete)
Il peut ensuite être défini comme BEFORE ou AFTER.

Pour les trigger agissant sur une ligne (ROW LEVEL trigger), comme c'est le cas ici, la doc donne une règle générale:

• Si le trigger doit modifier une valeur de la table sur laquelle il est défini, alors le trigger doit être déclaré comme BEFORE: c'est à dire agissant avant que la ligne ne soit écrite en base, ce qui permet donc de modifier les valeurs de la ligne.

• Si le trigger doit modifier la valeur d'une autre table, alors il doit être défini comme AFTER: la ligne de la table déclenchant le trigger doit être écrite, traitée par le système, pour que sa valeur soit prise en compte dans les autres tables.
Un AFTER trigger ne peut plus modifier les valeurs de la ligne: celle-ci est déjà écrite en base.

Ces deux "états" d'un trigger conditionnent la visibilité des données à l'intérieur de la fonction du trigger:
Dans une table vide dans laquelle on insère un record, un BEFORE trigger voit la table vide (si on fait un count(*) de la table dans le trigger) et un AFTER trigger voit la table avec un record dedans.
Le BEFORE peut, en revanche, agir sur la donnée à insérer dans la table (en changeant la valeur, en affectant une autre valeur à une colonne, etc.) tandis que le AFTER ne peut plus agir sur la table, mais peut par contre propager la valeur de la ligne à d'autres tables (pour faire un insert ou un update dans une autre table, comme c'est le cas dans ce thread).

Bouh, je sais pas si je suis très clair wink
La doc décrit tout ca en détail (http://www.postgresql.org/docs/9.2/stat … ition.html)

Nicolas

Hors ligne

 

#10 Tue 10 September 2013 15:47

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: Création d'un trigger postgres

Merci Nicolas pour cet exposé qui me conforte dans ce que j'avais cru comprendre du fonctionnement des triggers, me fait découvrir d'autres éléments mais qui me laisse encore perplexe sur le fonctionnement du trigger de Diophamidou.

Nicolas Ribot a écrit:

Bonjour,
• Si le trigger doit modifier une valeur de la table sur laquelle il est défini, alors le trigger doit être déclaré comme BEFORE: c'est à dire agissant avant que la ligne ne soit écrite en base, ce qui permet donc de modifier les valeurs de la ligne.
[...]
Un AFTER trigger ne peut plus modifier les valeurs de la ligne: celle-ci est déjà écrite en base.


Et c'est bien là que je suis perplexe car :
- la fonction définie effectue un update sur les champs de la table urba.n_zone_urba_76010_076 (en récupérant des champs de t2c);
- le trigger est défini sur la même table urba.n_zone_urba_76010_076;
On est bien dans le cas cité plus haut, non? Et si oui, le trigger ne devrait-il donc pas être before?
A moins que j'aie mal compris le projet depuis le début....

Cordialement

Hors ligne

 

Pied de page des forums

Powered by FluxBB