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 :

Trigger de comparaison de dates [MySQL-5.5]


Sujet :

SQL Procédural MySQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Etudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Trigger de comparaison de dates
    Bnjr;

    j'aimerais créer un 'trigger before insert' dans lequel je récupère par un select les titres de congés d'un fonctionnaire de ma table 'titrcng' , je veux par la suite comparer la nouvelle ligne à insérer avec toutes les lignes obtenues par le select , en fait , je veux vérifier que le titre de congé à insérer ne chevauche pas avec les titres du même fonctionnaire qui sont déjà dans la base de données , pour cela j'ai créé le trigger suivant :
    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
    delimiter //
    CREATE TRIGGER NON_OVERLAP  BEFORE INSERT ON `titrcng` 
    FOR EACH ROW 
    BEGIN 
    DECLARE  done  INT DEFAULT 0; 
    DECLARE DATDEB DATE;
    DECLARE DATFIN DATE ; 
    DECLARE OVERLAP_CURSOR  CURSOR FOR SELECT 'DatDeb' as DATDEB  ,'DatFin' as DATFIN  FROM titrcng  WHERE 'NSS'=NEW.NSS ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN OVERLAP_CURSOR;
    read_loop:LOOP 
    FETCH OVERLAP_CURSOR INTO DATDEB ,DATFIN ;
    IF done THEN LEAVE read_loop; 
    END IF ;
    IF (DATDEB <= NEW.DatFin  AND  NEW.DatDeb <= DATFIN ) THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = `Les congés ne doivent pas se chevaucher`;
    END IF;
    END LOOP;
    CLOSE OVERLAP_CURSOR;
    END//
    delimiter ;
    le trigger est effectivement créé , les triggers sont activés (SET GLOBAL event_scheduler=ON), mais quand j'insère une nouvelle ligne qui ne respect pas la condition évoquée dans le trigger , la ligne est quand même insérée ????
    quelq'un peut m'aider svp?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    Il me semble qu'il ne soit pas possible de stopper l'action qui a déclenché un TRIGGER, la seul solution est de créer une erreur de syntaxe dans le TRIGGER dans la condition qui ne valide pas l'insertion pour que la requête ayant lancé le trigger plante.

    Pour plus d'info : lien

    Une autre solution serait d'utiliser une procédure stokée au lieu de faire directement l'INSERT dans la table congé, il suffira de faire la vérification dans cette procédure et de ne pas exécuter l'INSERT en cas de problème.

    EDIT : Erreur de ma part depuis MySQL 5.5 Oracle a implémenté SIGNAL permettant de stopper un TRIGGER ou une Procédure stockée.

    Pour votre problème, je pense que votre condition IF (DATDEB <= NEW.DatFin AND NEW.DatDeb <= DATFIN ) THEN (Pensez à utiliser la balise [ CODE][/CODE ] sans les espaces pour afficher du code, cela le rend plus lisible pour nous.) n'est pas bonne, elle renvoi vrai seulement dans le cas où le nouveau congé est inclut complètement dans un congé déjà présent (commence après et fini avant un congé déjà présent dans la base).

    Il faut utiliser le OR plutôt que le AND dans votre condition.

    De plus il ne faut pas utiliser les caractères ``(Altgr+7) pour les chaînes de caractère MySQL les interprètes comme étant des noms de colonnes ou de tables, il faut soit utiliser les ""(atlgr+3) ou les ''(atlgr+4) pour les chaînes de caractère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Les congés ne doivent pas se chevaucher';
    une réponse vous a permis d'avancer ?

  3. #3
    Candidat au Club
    Femme Profil pro
    Etudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour ;

    Merci pour ta réponse Exia93 ;

    1-Pour le fait de stopper l'action qui déclenche le trigger , je pense que ça se fait (au moins pour l'exemple que j'ai réussi à faire, en voici l'exemple et son explication )

    Création du trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    delimiter //
    CREATE TRIGGER chk_date_rcrtmnt_date_sortie_update
    BEFORE UPDATE ON  `fctnre`
    FOR EACH ROW
    BEGIN
    IF (NEW.Dat_Sortie IS NOT  NULL AND NEW.Dat_Recrtmt > NEW.Dat_Sortie) THEN
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'La date de sortie doit être supérieure à la date de recrutement';
     
    END IF;
    END//
    delimiter ;
    en fait , ce trigger vérifie si la date de recrutement d'un fonctionnaire est inférieure à sa date de sortie , et effectivement lors de la mise à jour , si la date de sortie saisie est inférieure à la date de recrutement, mysql génère une erreur , affiche le message , et la mise à jour est annulée.je voulais te montrer l'erreur par insertion d'image png , mais ça marche pas !!!!

    2-Pour la condition , en faite je l'ai remplacée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF (DATEDEB < NEW.DatFin  AND  NEW.DatDeb < DATEFIN )
    j'utilise (strictement <) au lieu de (<= ) , je pense que celle là est bonne.

    3- Je prendrai en considération tes remarques concernant les guillemets de chaines de caractères et celles concernant la balise CODE

    j'essayerai de redéfinir mon trigger en prenant en considération vos remarques et je posterai un feedback
    Merci encore une fois .

  4. #4
    Candidat au Club
    Femme Profil pro
    Etudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    reBonjour ;


    ça y est , c'est fait , merci beaucoup d'avoir pris la peine de répondre à ma question Exia93, ça m'a encouragée à faire plus d'effort , en fait , voici la syntaxe de mon trigger ( ou plutôt de mes deux triggers l'un pour le INSERT et l'autre pour le UPDATE )

    Trigger pour l'insertion :

    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
    22
    23
    24
    25
    26
     
    delimiter //
    CREATE TRIGGER NON_OVERLAP2  BEFORE INSERT ON `titrcng` 
    FOR EACH ROW 
    BEGIN 
    DECLARE  done  INT DEFAULT 0; 
    DECLARE DATEDEB DATE;
    DECLARE DATEFIN DATE ; 
    DECLARE OVERLAP_CURSOR  CURSOR FOR SELECT `DatDeb`   ,`DatFin`   FROM titrcng  WHERE `NSS`=NEW.NSS ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN OVERLAP_CURSOR;
     
    read_loop : LOOP
    FETCH OVERLAP_CURSOR INTO DATEDEB ,DATEFIN ;
     IF done THEN 
       LEAVE read_loop; 
       END IF;
    IF (DATEDEB < NEW.DatFin  AND  NEW.DatDeb < DATEFIN ) THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Les titres ne doivent pas se chevaucher';
    END IF;
     
    END LOOP read_loop;
    CLOSE OVERLAP_CURSOR;
     
    END//
    delimiter ;
    Trigger pour la mise à jour :

    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
    22
    23
    24
    25
    26
     
    delimiter //
    CREATE TRIGGER NON_OVERLAP1  BEFORE UPDATE ON `titrcng` 
    FOR EACH ROW 
    BEGIN 
    DECLARE  done  INT DEFAULT 0; 
    DECLARE DATEDEB DATE;
    DECLARE DATEFIN DATE ; 
    DECLARE OVERLAP_CURSOR  CURSOR FOR SELECT `DatDeb`   ,`DatFin`   FROM titrcng  WHERE `NSS`=NEW.NSS ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN OVERLAP_CURSOR;
     
    read_loop : LOOP
    FETCH OVERLAP_CURSOR INTO DATEDEB ,DATEFIN ;
     IF done THEN 
       LEAVE read_loop; 
       END IF;
    IF (DATEDEB < NEW.DatFin  AND  NEW.DatDeb < DATEFIN ) THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Les titres ne doivent pas se chevaucher';
    END IF;
     
    END LOOP read_loop;
    CLOSE OVERLAP_CURSOR;
     
    END//
    delimiter ;
    ça marche nickel

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

Discussions similaires

  1. [XE] Comparaison de dates dans un Trigger
    Par Nicodemus dans le forum Oracle
    Réponses: 2
    Dernier message: 20/02/2006, 17h37
  2. comparaison de dates
    Par pmithrandir dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2005, 17h12
  3. comparaison de date
    Par nickoshiba dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/03/2005, 16h48
  4. Comparaison de dates
    Par Tapioca dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 16h55
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 22h43

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