Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trigger vérification donnée

Sujet résolu
    16 septembre 2021 à 8:43:21

    Bonjour !

    Je développe une application web dans laquelle je me sers d'une base de données mariadb pour stocker les données.

    Lors de l'insertion, je fais des contrôles pour l'insertion de donnée du coté serveur (en php), mais j'aimerai en faire aussi dans la base de données.

    Je ne suis pas un maître dans les bases de données donc j'ai pensé aux triggers, mais je ne sais pas comment faire.

    Pour expliquer mon problème, j'ai des activités dans laquelle il y a des places, et je stocke le nombre de places restantes dans la table activités.

    J'ai une table participer qui prend une activité et un participant (user), et lorsque j'insère dans la table participer, j'aimerai vérifier que le nombre de places restantes n'est pas égale à 0 pour prévenir d'un surplus de participant (je fais déjà le contrôle au niveau serveur, mais lors des essais j'ai eu une activité avec 16 participants sur 12... Peut-être qu'ils se sont inscrit en même temps donc je voudrais rajouter un contrôle pour rajouter de la robustesse svp)

    Merci beaucoup d'avance pour votre aide !

    Matthieu

    -
    Edité par MattAmsellem 16 septembre 2021 à 8:45:13

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2021 à 18:20:42

      Bonjour,

      MattAmsellem a écrit:

      j'ai des activités dans laquelle il y a des places, et je stocke le nombre de places restantes dans la table activités

      Pourquoi ? La logique serait de stocker le nombre total de places dans la table activités, et de compter par ailleurs le nombre de place prises dans la table participer pour la soustraire à ce total et obtenir le nombre de places disponibles ...

      Sinon, concernant ton problème, je suis plutôt du genre à conseiller "ceinture+bretelles". Un contrôle applicatif plus un contrôle base de données.

      Pour le contrôle applicatif, il consiste "simplement" à ne proposer que les activités dont le nombre de participants n'est pas égal au nombre total de places. Par exemple, alimenter la balise <select> des activités avec la liste suivante (ou bloquer l'affichage du bouton "Participer") :

      SELECT
          A.id_activite,
          A.titre,
          A.date_prevue,
          A.nb_places,
          IF( P.id_activite IS NULL, 0, COUNT(*) ) AS nb_participants
      FROM
          activites A
      		LEFT JOIN participer P
      			ON A.id_activite = P.id_activite
      GROUP BY
          A.id_activite,
          A.titre,
          A.date_prevue,
          A.nb_places
      HAVING COUNT(*) < A.nb_places

      Ce premier point limite le risque mais n'empêche pas d'insérer en base un participant de trop.

      Pour le contrôle en base, il faut en effet utiliser un TRIGGER qui lève une erreur et bloque l'insert si le nombre de participant après insertion viendrait à dépasser le nombre de places :

      DELIMITER &&
      
      CREATE OR REPLACE TRIGGER bloque_surbooking
      BEFORE INSERT ON participer
      FOR EACH ROW
      BEGIN
      	-- Nombre de places
      	SELECT nb_places INTO @nb_places
      	FROM activites
      	WHERE id_activite = NEW.id_activite;
      	
      	-- Nombre de participants
      	SELECT COUNT(*) INTO @nb_participants
      	FROM participer
      	WHERE id_activite = NEW.id_activite;
      	
      	IF @nb_participants = @nb_places THEN
      		SIGNAL SQLSTATE '23000'
      			SET MESSAGE_TEXT = 'Plus de place pour cette activité';
      	END IF;
      
      END&&
      
      DELIMITER ;
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        20 septembre 2021 à 8:52:54

        Bonjour !

        Désolé du retard, j'avais finit ma semaine du coup je reviens voir que maintenant...

        En fait pour la proposition des activités, je dois toutes les montrer pour que tout le monde puisse voir l'emploi du temps, du coup je suis obligé de tout selectionner...

        Mais merci pour le trigger, je ne savais pas comment le faire étant donné que j'ai du faire que quelques fois du PL/SQL, mais du coup j'ai comprit comment il marche et je l'ai modifié selon les attributs dans ma table.

        Merci beaucoup !

        Matthieu

        • Partager sur Facebook
        • Partager sur Twitter

        Trigger vérification donnée

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown