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 :

Pb de syntaxe trigger/begin.. end ?


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut Pb de syntaxe trigger/begin.. end ?
    bonjour,

    suite à une précédente question, je me suis lancé dans le joyeux monde des triggers.

    et j'ai déjà un problème, impossible de créer un trigger avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER trgActu BEFORE INSERT ON actualites FOR EACH ROW BEGIN
    INSERT INTO objets (CATEGORIE) VALUES ('actu');
    SET new.ID_OBJET =  LAST_INSERT_ID();
    END;
    Il me répond :

    #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 'INSERT INTO objets (CATEGORIE) VALUES ('actu')' at line 2
    j'ai fait un test et il semble qu'il n'accepte pas les BEGIN END;

    ce code marche par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TRIGGER trgActu BEFORE INSERT ON actualites FOR EACH ROW INSERT INTO objets (CATEGORIE) VALUES ('actu');

    je suis sur un serveur Mysql 5.0.18 mais je n'ai trouvé aucune référence à ce problème.

  2. #2
    Membre régulier Avatar de Nillak
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    Bonjour,
    je suis pas un expert des trigger puisque je n'en ai jamais utilisé mais il me semble que la synthaxe c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TRIGGER nom_du_trigger ON la_table FOR la_commande_concerné
    AS
    requete_1;
    requete_2;
    requete_3;
    ...
    GO
    Si ça peux t'aider
    C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison ! (Pierre Desproges)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Merci de ta réponse !

    j'ai fait quelques recherches et je n'ai vu ce type de syntaxe nulle part. je sais pas trop si ça vient de là.

    par contre, j'ai trouvé un autre sujet qui parle des délimiteurs et mon problème pourrait venir de là. Mais là aussi, impossible de les faire marcher (grrr).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    delimiter //
    CREATE TRIGGER trgActu
    BEFORE INSERT ON actualites
    FOR EACH ROW
    BEGIN
    INSERT INTO objets(CATEGORIE) VALUES('actu');
    SET new.ID_OBJET=LAST_INSERT_ID();
    END//
    delimiter ;

    MàJ :
    j'ai réussi à créer mon trigger directement à partir du client en ligne de commande.

  4. #4
    Membre régulier Avatar de Nillak
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    au passage est-ce qu'il ne manquerait pas des quotes dans ta requete INSERT INTO
    c'est à dire de l'écrire comme ça :
    INSERT INTO objets ('CATEGORIE') VALUES ('actu');

    désolé je peux pas faire mieux n'est pas le temps ces jours-ci de creuser le problème, vraiment désolé
    juste ce lien
    http://dev.mysql.com/doc/refman/5.0/en/triggers.html
    C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison ! (Pierre Desproges)

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    la solution au pb des BEGIN... END dépend du client. La commande DELIMITER n'est valable que pour le client texte. BEGIN... END est inutilisable avec phpMyAdmin, par contre il ne pose pas de pb à l'API PHP (mysql_query).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    la syntaxe utilisée dans ton premier message me semble OK. Quant à celle de Nillak, ça doit venir d'un autre SGBD...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    re !

    bon, j'ai résolu mon problème.

    Par le client en mode ligne de commande, il semble nécessaire de redéfinir le DELIMITER pour pouvoir utiliser sans problème les instructions BEGIN .. END.

    Via un outil comme phpmadmin ou une requete sql envoyé via php, la solution consiste à utiliser l'extension php mysqli, qui permet d'avoir accès aux fonctionnaltés de MySQL 4.1 et 5.0 (entre autres, les triggers et les instructions begin .. end dans mon cas)

    phpmyadmin depuis les versions 2.6.xx et > peut utiliser soir l'extension mysql soit l'extension mysqli (voir fichier de config).

    Pour le faire directement via une requete dans un script php, voilà le code que j'ai utilisé :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    <?
     
    $link = mysqli_connect("host", "user", "pass", "dbname");
     
    if (mysqli_connect_errno()) {
        echo mysqli_connect_error();
        exit();
    } else {
        echo 'connexion reussie !<br>';
    }
     
    $query = "drop trigger trgActu;";
    $result = mysqli_query($link, $query);
    $query = "drop trigger trgEvent;";
    $result = mysqli_query($link, $query);
     
     
    $query = "CREATE TRIGGER trgActu
    		  BEFORE INSERT ON actualites
    		  FOR EACH ROW
    		  BEGIN
    			INSERT INTO objets(CATEGORIE) VALUES('actu');
    			SET new.ID_OBJET=LAST_INSERT_ID();
              END;";
    $result = mysqli_query($link, $query);
     
    $query = "CREATE TRIGGER trgEvent
    		  BEFORE INSERT ON evenements
    		  FOR EACH ROW
    		  BEGIN
    			INSERT INTO objets(CATEGORIE) VALUES('event');
    			SET new.ID_OBJET=LAST_INSERT_ID();
              END;";
    $result = mysqli_query($link, $query);
     
    echo mysqli_error($link);
    mysqli_close($link);
    ?>

    Merci internet !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Antoun
    la solution au pb des BEGIN... END dépend du client. La commande DELIMITER n'est valable que pour le client texte. BEGIN... END est inutilisable avec phpMyAdmin, par contre il ne pose pas de pb à l'API PHP (mysql_query).
    Je donne la solution pour phpmyadmin dans mon précédent message. Par contre, j'ai essayé avec mysql_query et ça ne marchait pas. C'est là que j'ai trouvé une solution sur le net qui conseillait d'utiliser mysqli.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/03/2007, 17h21
  2. Syntax error: unexpected end of file
    Par freakfm dans le forum Linux
    Réponses: 1
    Dernier message: 13/09/2006, 19h56
  3. Bloc PL/SQl BEGIN/END
    Par claralavraie dans le forum PL/SQL
    Réponses: 1
    Dernier message: 24/02/2006, 11h03
  4. [10gR2] Execution d'un bloc begin...end
    Par hotkebab99 dans le forum Oracle
    Réponses: 2
    Dernier message: 11/01/2006, 12h26
  5. Auto-complétion pour les mots clés Begin/End
    Par Alex Laforest dans le forum EDI
    Réponses: 2
    Dernier message: 21/09/2005, 21h26

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