Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Débuter
Débuter Forum d'entraide : Débuter en base de données avec PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/07/2011, 16h14   #1
Membre expérimenté
 
Inscription : février 2004
Messages : 1 301
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 1 301
Points : 527
Points : 527
Envoyer un message via MSN à mister3957
Par défaut Maîtriser le déclenchement des triggers

Bonjour à tous,

J'ai une table qui contient des rues :
- id
- nom
- geometry (line)

Puis une qui contient les noeuds composants cette rue
- id
- id_street
- geometry (point)

La géométrie au niveau des rues est là pour améliorer la performances des select (plutôt que faire une jointure sur les noeuds et reconstruire la géométrie lors du select)

Désormais, je dois faire un trigger qui va mettre à jour la géométrie de la rue lorsque l'on "touche" à l'un de ses noeuds, afin d'assurer la cohérence des données.

Comment puis-je faire ça ?

J'ai vu quelques exemple mais c'est toujours lorsqu'un champ d'une même table doit être mis à jour lorsque la ligne est à jour, donc facile..

Merci à vous,
A bientôt
mister3957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 16h41   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Comment as-tu rempli la colonne rue.gometry ?
Ne connaissant pas (encore) les fonctions géométriques de Postgresql et/ou Postgis, je suppose qu'il s'agit d'une fonction qui construit la ligne de la rue à partir de ses points ?

Tu devrais donc pouvoir utiliser cette fonction dans une requête UPDATE.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 18h07   #3
Membre expérimenté
 
Inscription : février 2004
Messages : 1 301
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 1 301
Points : 527
Points : 527
Envoyer un message via MSN à mister3957
Bon.. j'ai réfléchit un peu (même si j'aurai mieux fait de le faire avant de créer ce sujet, désolé), et toute ma confusion réside en ces questions :

Que vaut le "old.id" dans le cas d'un BEFORE INSERT ?
Que vaut le "new.id" dans le cas d'un AFTER DELETE

Car je veux faire un trigger qui utilise soit le new.id, soit le old.id, déclenché par les évenements AFTER INSERT et AFTER DELETE mais je ne sais pas ce qui se passe si j'utilise le "old.id" sur un AFTER INSERT et le old.id sur un AFTER DELETE..

C'est pour éviter de faire 4 triggers..

Même si ça ne t'aideras pas à me répondre, comme tu m'as posé la question, pour construire la géométrie d'une rue en fonction des points, je fais :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT ST_Multi(St_MakeLine(sub.geo1, sub.geo2))
   FROM (
    SELECT
        wn1.id, n1.geo AS geo1, n2.geo AS geo2
    FROM
        way_nodes wn1,
        way_nodes wn2,
        nodes n1,
        nodes n2
    WHERE
        wn2.id = wn1.id AND
        n1.id = wn1.node_id AND
        n2.id = wn2.node_id AND
        wn2.sequence_id = wn1.sequence_id + 1
    ORDER BY wn1.sequence_id) sub
WHERE sub.id = argId;
Où argId est l'identifiant de la rue. C'est un peu lourd mais c'est pour bien suivre l’algorithmie de l'outils "osm2pgsql", l'outils utilisé pour ensuite se servir de MapServer avec des "MapFile" prêt à l'emploi.
mister3957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 10h58   #4
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par mister3957 Voir le message
Que vaut le "old.id" dans le cas d'un BEFORE INSERT ?
Que vaut le "new.id" dans le cas d'un AFTER DELETE

Car je veux faire un trigger qui utilise soit le new.id, soit le old.id, déclenché par les évenements AFTER INSERT et AFTER DELETE mais je ne sais pas ce qui se passe si j'utilise le "old.id" sur un AFTER INSERT et le old.id sur un AFTER DELETE..
Il ne se passera rien de bon, puisque le OLD n'a pas de raison d'exister dans un trigger INSERT , ni le NEW dans un DELETE.

Mais en revanche on peut utiliser la variable TG_OP pour savoir dans le trigger s'il a été appelé pour un INSERT ou un DELETE, voir la doc à ce sujet.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h23.


 
 
 
 
Partenaires

Hébergement Web