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 :

Trigger sur une table met à jour d'autres tables


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Trigger sur une table met à jour d'autres tables
    Bonjour,
    alors moi j'aimerais créer un trigger sur une table location, qui lors d'un ajout sur cette table, fait un update sur 2 autres tables mettant à jour les champs concernés.

    Ces champs sont de type boolean donc true ou false.

    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
    17
    18
    19
     
    CREATE OR REPLACE FUNCTION dispo () RETURNS trigger AS 
    '
      DECLARE
        nodispo boolean;
        client varchar(4);
        voiture varchar(4);
      BEGIN 
        select into nodispo rendu from location;
        select into client id_client from location;
        select into voiture id_vehicule from location;
          update clients set location_dispo = nodispo 
    	where id_client = client;
          update vehicules set dispo_vehicule = nodispo 
    	where id_vehicule = voiture;
        return new;
      END; 
    ' 
    LANGUAGE 'plpgsql';
    Ensuite je définis cet fonction en trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TRIGGER trig_dispo AFTER INSERT ON location 
      FOR EACH ROW 
      EXECUTE PROCEDURE dispo();
    Ce code ne tiens en compte que de la première Insertion dans la table "location" et ne marche plus lors du deuxième insertion.

    Quelqu'un pourrait m'aider et aussi m'expliquer le fonctionnement du Return NEW ??

    merci d'avance,

    KiAhS

  2. #2
    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
    Cette partie de code est fausse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       select into nodispo rendu from location;
        select into client id_client from location;
        select into voiture id_vehicule from location;
    parce qu'il n'y a pas qu'une seule ligne dans location.

    Et en fait elle est inutile car les valeurs de la ligne en cours sont dans NEW.id_client, NEW.id_vehicule, etc.. pas besoin de requête select pour les trouver.

    Il faut plutôt faire directement qqch du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          update clients set location_dispo = NEW.rendu 
    	where id_client = NEW.id_client;
     
          update vehicules set dispo_vehicule = NEW.rendu 
    	where id_vehicule = NEW.id_vehicule;
    Quand au return new je ne suis pas sûr qu'il soit utile dans un trigger AFTER INSERT mais en tout cas il n'est pas génant.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/01/2013, 14h28
  2. Trigger sur une table d'une autre base
    Par Tristan Zwingelstein dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/01/2012, 09h37
  3. Réponses: 12
    Dernier message: 06/08/2010, 15h00
  4. Trigger sur une table et mise à jour
    Par fffonck dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/06/2009, 11h11
  5. Trigger sur une même table
    Par lamanoo dans le forum DB2
    Réponses: 6
    Dernier message: 29/08/2007, 17h01

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