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 :

Ajouter ou mettre à jour par trigger


Sujet :

SQL Procédural MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Ajouter ou mettre à jour par trigger
    Bonjour à tous,

    Je suis en train de faire mon premier trigger et j'aurais besoin d'un coup de main.
    Le but de ce trigger et de contrôler avant insertion dans la table si un host existe (`depuis_la_station`) dans la table. Si cette host existe il faut mettre les deux autres champs à jours sinon rajouter la ligne entière.

    Voilà ce que j'ai commencé à faire, mais je pense mélanger un peu les choses, surtout avec mon histoire de SELECT.
    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 $$
     
    DROP TRIGGER IF EXISTS `ocsweb`.`detectINSERT`$$
     
    CREATE TRIGGER `ocsweb`.`detectINSERT` BEFORE INSERT on `ocsweb`.`BGInfoTable`
    FOR EACH ROW 
    BEGIN
     
    DECLARE host_ins tinytext;
    DECLARE host_exist tinytext;
     
     
    SET host_ins = new.depuis_la_station;
     
    SET host_exist = SELECT `ocsweb`.`BGInfoTable`.`depuis_la_station`AS Stations FROM `ocsweb`.`BGInfoTable` WHERE `ocsweb`.`BGInfoTable`.`depuis_la_station`= host_ins;
     
     
    	IF host_ins=host_exist THEN 
    		UPDATE `ocsweb`.`BGInfoTable` SET `Time_Stamp`=new.Time_Stamp, `User_Name`=new.User_Name WHERE `depuis_la_station`=host_exist;
    	ELSE
    		INSERT INTO `ocsweb`.`BGInfoTable`(`Time_Stamp`,`depuis_la_station`,`User_Name`) VALUES (new.Time_Stamp,new.depuis_la_station,new.User_Name);
     
     
    END$$
    DELIMITER ;

  2. #2
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Bonjour,

    Il existe peut-être des erreurs d'ordre logique (je n'ai pas regardé en profondeur pour le moment, mais avant toute chose obtient tu des erreurs ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Erreur
    Voilà l'erreur que j'ai à ce stade du script :

    (0 row(s)affected)
    (0 ms taken)

    Error Code : 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT `ocsweb`.`BGInfoTable`.`depuis_la_station`AS Stations FROM `ocsweb`.`BGIn' at line 7
    (0 ms taken)

  4. #4
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Peut-être ceci te mettra sur la voie


    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
    DELIMITER $$
     
    DROP TRIGGER IF EXISTS `ocsweb`.`detectINSERT`$$
     
    CREATE TRIGGER `ocsweb`.`detectINSERT` BEFORE INSERT ON `ocsweb`.`BGInfoTable`
    FOR EACH ROW 
    BEGIN
     
    DECLARE host_ins tinytext;
    DECLARE host_exist tinytext DEFAULT NULL ;
     
     
    SET host_ins = new.depuis_la_station;
     
    SELECT `ocsweb`.`BGInfoTable`.`depuis_la_station`AS Stations INTO host_exist FROM `ocsweb`.`BGInfoTable` WHERE `ocsweb`.`BGInfoTable`.`depuis_la_station`= host_ins;
     
     
    	IF host_exist IS NOT NULL THEN 
    		UPDATE `ocsweb`.`BGInfoTable` SET `Time_Stamp`=new.Time_Stamp, `User_Name`=new.User_Name WHERE `depuis_la_station`=host_exist;
    	ELSE
    		INSERT INTO `ocsweb`.`BGInfoTable`(`Time_Stamp`,`depuis_la_station`,`User_Name`) VALUES (new.Time_Stamp,new.depuis_la_station,new.User_Name);
     
     
    END$$
    DELIMITER ;

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Je pense que le premier problème est effectivement le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET host_exist = SELECT ... ;
    La première solution t'a été donnée par kazou, il s'agit de transformer le SET en un SELECT... INTO.

    La seconde est simplement de mettre deux parenthèses autour de ton SELECT, qui est une sous-requête (et doit donc s'écrire entre parenthèses) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET host_exist = (SELECT ... ) ;

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Suite pb
    Merci pour vos aides.

    Voici la suite des hostilités :

    J'ai donc récupéré le code et j'ai testé les 2 solutions :

    ici j'affiche la seconde

    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
    27
    28
    29
    30
    DELIMITER $$
     
    DROP TRIGGER IF EXISTS `ocsweb`.`detectINSERT`$$
     
    CREATE TRIGGER `ocsweb`.`detectINSERT` BEFORE INSERT ON `ocsweb`.`BGInfoTable`
    FOR EACH ROW 
    BEGIN
     
    DECLARE host_ins tinytext;
    DECLARE host_exist tinytext DEFAULT NULL ;
     
     
    SET host_ins = new.depuis_la_station;
     
    SET host_exist=(SELECT `ocsweb`.`BGInfoTable`.`depuis_la_station`AS Stations 
                    FROM `ocsweb`.`BGInfoTable` 
                    WHERE `ocsweb`.`BGInfoTable`.`depuis_la_station`= host_ins);
     
     
    	IF host_exist IS NOT NULL THEN 
    		UPDATE `ocsweb`.`BGInfoTable` 
                    SET `Time_Stamp`=new.Time_Stamp,`User_Name`=new.User_Name  
                    WHERE `depuis_la_station`= host_exist;
    	ELSE
    		INSERT INTO `ocsweb`.`BGInfoTable`(`Time_Stamp`,`depuis_la_station`,`User_Name`) 
                    VALUES (new.Time_Stamp,new.depuis_la_station,new.User_Name);
     
     
    END$$
    DELIMITER ;
    Et l'erreur qui va avec :

    (0 row(s)affected)
    (0 ms taken)

    Error Code : 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 20
    (0 ms taken)


    Je vois aucune erreur moi pour l'instant, la ligne 20 c'est la ligne du ELSE

    Vous en pensez quoi ?
    Dans la variable host_exist il doit y avoir une valeur quand il trouve l'host car je m'en sert après dans une clause WHERE. Puis-je appeler la variable comme ça ou doit-je spécifier un champ dans cette variable (genre host_exist.depuis_la_station) ??

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Erreur Trouver
    Il manquait le END IF;

    Et c'est bon ça m'a créer un trigger manque plus qu'à tester

    Mais j'ai toujours ma dernière question en suspend, j'aimerais savoir :

    Puis-je appeler la variable comme ça ou doit-je spécifier un champ dans cette variable (genre host_exist.depuis_la_station) ??

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Citation Envoyé par Genohunter Voir le message
    Puis-je appeler la variable comme ça ou doit-je spécifier un champ dans cette variable (genre host_exist.depuis_la_station) ??
    Normalement, tu peux appeler la variable comme ça... mais je ne comprends pas ce que tu veux dire par "spécifier un champ" ? Cette variable est un TINYTEXT, par une table.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Au final
    Voici un trigger parfaitement fonctionnel

    Il a pour fonction de surveiller les INSERT dans une table et ajout ou met à jour dans une autre table de manière à ce qu'un critère reste unique dans cette nouvelle table.

    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
    DELIMITER $$
     
    DROP TRIGGER IF EXISTS `ocsweb`.`detectINSERT`$$
     
    CREATE TRIGGER `ocsweb`.`detectINSERT` BEFORE INSERT ON `ocsweb`.`BGInfoTable`
    FOR EACH ROW 
    BEGIN
     
    DECLARE host_ins tinytext;
    DECLARE user_ins tinytext;
    DECLARE user_exist tinytext DEFAULT NULL ;
     
     
    SET host_ins = new.depuis_la_station;
    SET user_ins = new.User_Name;
    SET user_exist=(SELECT `ocsweb`.`BGInfoTableLight`.`User_Name`AS Utilisateur FROM `ocsweb`.`BGInfoTableLight` WHERE `ocsweb`.`BGInfoTableLight`.`User_Name`= user_ins); 
     
    	IF user_exist IS NOT NULL THEN 
    		UPDATE `ocsweb`.`BGInfoTableLight` SET `Time_Stamp`=new.Time_Stamp,`depuis_la_station`=host_ins WHERE `ocsweb`.`BGInfoTableLight`.`User_Name`= user_exist;
    	ELSE
    		INSERT INTO `ocsweb`.`BGInfoTableLight`(`Time_Stamp`,`depuis_la_station`,`User_Name`) VALUES (new.Time_Stamp,new.depuis_la_station,new.User_Name);
    	END IF;
     
    END$$
    DELIMITER ;

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

Discussions similaires

  1. Ajouter ou mettre à jour des éléments d'un fichier A vers un fichier B
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 17
    Dernier message: 02/09/2010, 15h46
  2. Mettre à jour des tables avec un trigger
    Par Titouf dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/01/2008, 15h57
  3. Mettre à jour par le net son application
    Par Malone dans le forum Delphi
    Réponses: 2
    Dernier message: 28/09/2006, 14h21
  4. Mettre à jour un controle par dblclik avec sous-formulaire
    Par lagratteCchouette dans le forum Access
    Réponses: 10
    Dernier message: 19/04/2006, 19h47
  5. Mettre la date du jour par défaut
    Par Oberown dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/03/2005, 15h35

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