IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 PostgreSQL Discussion :

Maîtriser le déclenchement des triggers


Sujet :

PostgreSQL

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    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

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    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.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

Discussions similaires

  1. Déclenchement des triggers MySQL
    Par Adlery dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 19/07/2012, 14h49
  2. Réponses: 1
    Dernier message: 15/07/2011, 15h17
  3. Fonction IMP - Déclenchement des Triggers ou non?
    Par JahPil78 dans le forum Import/Export
    Réponses: 2
    Dernier message: 13/07/2007, 22h08
  4. Réponses: 5
    Dernier message: 02/12/2005, 18h54
  5. Delphi5 (IBX) - Interbase6.0 + Utilisation des triggers
    Par _Marsu_ dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/04/2004, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo