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

SQL Procédural MySQL Discussion :

[Triggers] Modifier NEW en AFTER INSERT


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut [Triggers] Modifier NEW en AFTER INSERT
    Hi everybody !

    Je me suis récemment lancé dans le MySQL procédural pour mon site web (car n'ayant pas remarqué auparavant que les nouvelles versions du serveur le permettaient).

    J'ai donc créé de nombreux triggers, procédures et fonctions en espérant gagner ainsi en terme de performances.

    Parmi les trigger, un en particulier me pose problème... Je m'explique :

    Les utilisateurs de mon site peuvent créer des "sorties" (loisirs, etc. c'est pour une asso). Lorsque la sortie est créée, un trigger s'occupe de :

    • Créer une galerie d'image pour cette sortie
    • Créer un post sur le forum
    • Lier la sortie, le post et la galerie au groupe correspondant (asso composée de plusieurs groupes situés dans des villes différentes)
    • Remplir la table "aConsulter", table que j'utilise pour avertir les utilisateurs qu'il y a de nouvelles données à lire


    Voici donc ce que ça donne :

    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
    20
    21
    CREATE TRIGGER `ajouterRencontre` AFTER INSERT ON `rencontres`
     FOR EACH ROW BEGIN
      //Lie la rencontre au groupe
      insert into etreConcerne values (NEW.idGroupe,NEW.id);
     
      //Créé le post et le lie au groupe
      SELECT rencontres INTO @idForum FROM forums WHERE idGroupe=NEW.idGroupe AND rencontres=1;
      insert into posts values (0,NEW.idGroupe,NEW.titre,NEW.idUser,NEW.ip,0,@idForum,0,NEW.dateHeure,NEW.dateHeureFin,0,0,0,NEW.descriptif,0,NEW.type,1,0,0,'',0);
      SET @idPost=last_insert_id();
      UPDATE rencontres SET idPost=@idPost WHERE id=NEW.id;
      INSERT INTO etreAuteur values (NEW.idGroupe,@idPost);
     
      //Créé la galerie
      INSERT INTO galeries values (0,NEW.idGroupe,NEW.titre,NEW.idUser,NEW.dateHeure,'',0,0,NEW.id,0);
      SET @idGalerie=last_insert_id();
      INSERT INTO etreProprietaire values (NEW.idGroupe,@idGalerie);
     
      //Créé les occurences dans la table "aConsulter"
      INSERT INTO aConsulter SELECT 'rencontre',users.id,NEW.id,@idForum,NEW.dateHeure from users where not(users.id=NEW.idUser);
      INSERT INTO aConsulter SELECT 'forum',users.id,@idPost,@idForum,NEW.dateHeure from users where not(users.id=NEW.idUser);
    END
    Le problème, comme certains l'auront sûrement remarqué, c'est qu'on ne peut pas modifier la valeur de NEW dans un trigger AFTER INSERT. On ne le peut que dans un BEFORE INSERT. Seulement, moi j'ai besoin de l'ID de l'autoincrément de l'enregistrement dans la table "rencontres", chose que je n'obtiendrai pas dans un BEFORE INSERT...

    J'ai bien entendu pensé à une fonction mais il se peut que des sorties soient ajoutées à même la base de données et dans ce cas là, la fonction ne sera pas utilisée...

    Est-ce que quelqu'un a une idée pour résoudre mon problème ?

    Merci d'avance

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par défaut
    Si j'ai bien compris, tu veux l'id de la rencontre qui suivra celui que tu viens de créer??

  3. #3
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Effectivement ça n'était pas bien expliqué. L'objectif est me modifier, dans le trigger, le champ "idPost" de ma table "rencontres".

    La ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE rencontres SET idPost=@idPost WHERE id=NEW.id;
    Me renvoi une erreur : impossible de modifier la table car elle est déjà utilisée (elle fait en effet l'objet du trigger).

    J'ai donc essayé :

    Mais là non plus ça n'est pas possible car en AFTER INSERT, la variable NEW est en lecture seule...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger after insertion pas validée
    Par guigeek dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/12/2006, 13h37
  2. Trigger after insertion pas validée
    Par guigeek dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/12/2006, 14h23
  3. Un Trigger After INSERT peut-il empêcher l'INSERT ?
    Par cian2006 dans le forum Oracle
    Réponses: 3
    Dernier message: 13/09/2006, 17h27
  4. Trigger after insert, sans each row, possible ??
    Par veenie dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2006, 15h18
  5. [Trigger] -recursivité before|after insert
    Par jacquesh dans le forum Oracle
    Réponses: 3
    Dernier message: 24/11/2005, 15h10

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