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 :

Problème [trigger before insert] sous condition & jointure [MySQL-5.7]


Sujet :

SQL Procédural MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Problème [trigger before insert] sous condition & jointure
    Bonjour

    Je souhaite créer un trigger dans une table "Y" empêchant l'insertion lorsqu'une valeur est supérieur à la référence d'une table "X"

    Problème

    Dans une table 'palier', j'ai une colonne 'nb_porte' qui détermine le nombre de pièce accessible depuis ce palier.
    Dans une table 'pièce', j'ai une colonne 'porte' qui identifie le local.

    Le trigger que je souhaite mettre en place doit empêcher l'insertion d'un numéro de porte (dans la table 'pièce') lorsque ce n° est supérieur au 'nb_porte' autorisé.

    Parmi mes multiples tentatives, il y a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TRIGGER `Controle_porte` BEFORE INSERT ON `room` FOR EACH ROW
    BEGIN
        SELECT nb_room FROM palier AS P
        JOIN room AS Ro
        ON (Ro.ref=P.idPal);
    		IF new.door > nb_door
    		THEN SET MESSAGE_TEXT = 'Limite porte atteinte';
    		END IF;
    END
    Questions
    1. Y a-t-il une âme compétente pour m'aiguiller sur cette réalisation ?
    2. Peut-on placer nos jointures dans un trigger ?
    3. Puisque le trigger agit à un instant 'T' sur les valeurs en cours, fera-t-il la liaison sur les bonnes valeurs liées d'une autre table ? (dans la table 'palier', j'ai plusieurs 'nb_porte')



    NB 1 : je suis conscient qu'il serait plus simple de mettre cette sécurité dans le code .php lié à cette Bdd.
    Mais c'est bien un trigger que je souhaite mettre en place.
    NB 2 : cela fait 2 jours que je parcours nombre de forum, tuto et autre doc... sans trouver satisfaction :/

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Solution
    Je n'avais visiblement pas encore assez fouillé

    Voici le trigger qui répondait à mes attentes (merci Artemis)

    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
     
    CREATE TRIGGER `check_door` BEFORE INSERT ON `room` FOR EACH ROW
    BEGIN
        DECLARE alert VARCHAR(50);
        DECLARE nb_D INT;
     
        SET nb_D= (SELECT nb_room FROM palier AS P
    		      JOIN room AS Ro
                          ON (P.idPal=Ro.ref)
                          WHERE ref=new.ref);
     
        IF (new.noRo > nb_D) THEN
    	SET alert = concat('Seulement ', nb_room, ' possibles');
            SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT= _msg, MYSQL_ERRNO = 7777;
        END IF;
    END

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Cela étant, fonctionnellement, cela signifie que chaque pièce ne comporte qu'une porte : celle donnant sur la palier
    C'est très restrictif, est-ce bien ce qui est souhaité ?

    Sans compter qu'on pourrait aussi déduire le nombre de pièces du palier à partir du nombre de portes de chaque pièce adjacentes donnant sur ce palier...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Cela étant, fonctionnellement, cela signifie que chaque pièce ne comporte qu'une porte : celle donnant sur la palier
    C'est très restrictif, est-ce bien ce qui est souhaité ?
    Pour ce que je met en place, cela correspond parfaitement.
    Il faut voir les portes *Palier-Local* comme des points d'accès.
    Cela ne signifie pas qu'il ne peut pas y avoir d'autres portes dans les locaux, donnant sur d'autres locaux (ce qui de toute façon importe peu pour mon projet).

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

Discussions similaires

  1. Insertion avec condition trigger
    Par Nikko42 dans le forum Développement
    Réponses: 1
    Dernier message: 14/12/2012, 09h19
  2. Réponses: 2
    Dernier message: 11/08/2012, 10h28
  3. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  4. INSERT avec condition d'une table à une autre
    Par papipasto dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/03/2006, 13h51
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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