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 :

Erreur de syntaxe sur trigger avec mysql 5.1


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut Erreur de syntaxe sur trigger avec mysql 5.1
    Salut,

    Localement, je suis avec une configuration MySQL v5.5.9 et phpMyAdmin 3.3.9.1.
    J'ai programmé un simple trigger interdisant la suppression de compte clients dont les ID sont entre 1 et 10 :
    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 delete_forbidden BEFORE DELETE ON osc_customers
    FOR EACH ROW 
    BEGIN 
        DECLARE ERR_INITIAL CONDITION FOR SQLSTATE '12345';
        IF ((SELECT customers_id FROM osc_customers WHERE customers_id = OLD.customers_id) BETWEEN 1 AND 10 ) THEN
    SIGNAL ERR_INITIAL
    SET MESSAGE_TEXT = 'Permission denied : this customer can not be deleted'; 
        END IF; 
    END//
    delimiter ;
    le trigger est bien enregistré et fonctionnel (la suppression d'un client entre 1 et 10 renvoit bien le message d'erreur)

    Le soucis est que sur ma base de données distante, j'ai l'erreur suivante :
    #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 'ERR_INITIAL SET MESSAGE_TEXT = 'Permission denied : this customer can not be del' at line 7
    en plus la config n'est pas la même : MySQL v5.1.39-1 et phpMyAdmin 3.4.8

    là, je sèche complet.
    Où est mon erreur de syntaxe ?

    Merci.

    Cdt,

    Laurent

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 55
    Par défaut
    Bonjour

    Il ne manque pas un ";" à la fin du Signal ??

    Francis

  3. #3
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    ça vient peut-être de ton numéro de code d'erreur:
    Attention, avant de choisir un code d'erreur, il faut s'assurer qu'il n'est pas déjà pris par le SGBD.
    MySQL utilise les codes allant de 1000 à 2999 (tous ne sont pas utilisés mais il faut s'attendre à ce qu'ils puissent être pris dans les versions ultérieurs). Nous ne savons pas précisément comment le SGBD va évoluer et si les codes que nous allons choisir seront utilisés par la suite ou resterons libres, il est alors préférable de choisir un code négatif qui ne sera pas utilisé par MySQL.
    il se peut donc qu'entre les 2 versions ce code soit utilisé...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    Salut,

    ça fait une journée que j'écume tous les sujets du net ...

    d'ailleurs, lorsque j'exporte la table TRIGGERS de la base système Information_schema :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO `TRIGGERS` (`TRIGGER_CATALOG`, `TRIGGER_SCHEMA`, `TRIGGER_NAME`, `EVENT_MANIPULATION`, `EVENT_OBJECT_CATALOG`, `EVENT_OBJECT_SCHEMA`, `EVENT_OBJECT_TABLE`, `ACTION_ORDER`, `ACTION_CONDITION`, `ACTION_STATEMENT`, `ACTION_ORIENTATION`, `ACTION_TIMING`, `ACTION_REFERENCE_OLD_TABLE`, `ACTION_REFERENCE_NEW_TABLE`, `ACTION_REFERENCE_OLD_ROW`, `ACTION_REFERENCE_NEW_ROW`, `CREATED`, `SQL_MODE`, `DEFINER`, `CHARACTER_SET_CLIENT`, `COLLATION_CONNECTION`, `DATABASE_COLLATION`) VALUES
    ('def', 'nom_de_ma_base', 'delete_forbidden', 'DELETE', 'def', 'nom_de_ma_base', 'osc_customers', 0, NULL, 'BEGIN \r\n    DECLARE msg VARCHAR(255);\r\n    DECLARE ERR_INITIAL CONDITION FOR SQLSTATE ''12345'';\r\n    IF ((SELECT customers_id FROM osc_customers WHERE customers_id = OLD.customers_id) BETWEEN 1 AND 10 ) THEN\r\nSIGNAL ERR_INITIAL\r\nSET MESSAGE_TEXT = ''Permission denied : this customer can not be deleted''; \r\n    END IF; \r\nEND', 'ROW', 'BEFORE', NULL, NULL, 'OLD', 'NEW', NULL, '', 'root@localhost', 'utf8', 'utf8_general_ci', 'utf8_general_ci');
    on retrouve bien le trigger.
    Bref, le sql dynamique sur ce SGBD est vraiment merdique.

    au pire des cas, je coderai une grosse bouse du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER delete_forbidden BEFORE DELETE ON osc_customers
    FOR EACH ROW 
    BEGIN
    IF OLD.customers_id < 10 THEN    
       CALL CustLimit();
    END IF;
    END
    avec une procédure CustLimit() inexistante ...

    [edit]
    sauf erreur de ma part, la gestion des SIGNAL pour les triggers n'est pas implémentée dans la version MySQL 5.1, d' où l'erreur de syntaxe.
    ça serait bien que cela soit confirmé par un cador du mysql.

    [/edit]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut Alors finalement ...
    Donc je confirme bien qu'avec MySQL 5.1.x, les SIGNAL ne sont pas implémentés.
    Chez mon hébergeur, c'est cette version en cours.
    Alors j'ai changé mon fusil d'épaule, aujourd'hui je développe dans le cloud avec Pagodabox, qui eux, ont la dernière version MySQL 5.5.22.
    Petite restriction quand même, la programmation de TRIGGER n'est pas possible (pour une histoire de réplication des DB hébergées dans le cloud)
    Néanmoins, les procédures stockées sont possibles.
    Du coup, mon code a légèrement changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DROP PROCEDURE `DeleteCustomer`;
    DELIMITER ;;
    CREATE PROCEDURE `DeleteCustomer` (IN `custid` int)
    BEGIN
    DECLARE msg VARCHAR(255);
    IF (SELECT protected FROM osc_customers WHERE customers_id = custid AND protected = 1) THEN 
    set msg = CONCAT("This action is forbidden for the customer with the ID " , custid);
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    ELSE
    DELETE FROM osc_customers WHERE customers_id = custid; 
    END IF;
    END;;
    DELIMITER ;
    Donc, dans mon application PHP, j'ai viré les requêtes en les remplaçant avec des CALL xxx(IN yyy)
    Je n'ai plus qu'à créer une class pdo_exception pour gérer les retours des messages dans l'interface.

    Un de ses quatre, je présenterai l'ensemble du projet sur Developpez.com afin de recueillir l'avis de professionnels.

    A+

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

Discussions similaires

  1. Erreur de syntaxe sur un trigger
    Par mmahouac dans le forum Développement
    Réponses: 1
    Dernier message: 07/04/2009, 17h15
  2. [MySQL] Erreurs de syntaxe sur requêtes DELETE
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2006, 15h53
  3. Erreur de syntax sur JOIN
    Par helje dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/03/2006, 17h36
  4. erreur ASM inline sur 'INT' avec delphi7
    Par the_magik_mushroom dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 01h41
  5. Erreur de syntaxe sur la création d'une vue.
    Par cgougeon dans le forum Installation
    Réponses: 3
    Dernier message: 09/09/2005, 11h00

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