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 :

1er Trigger sous MySQL quand on vient d'Oracle


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut 1er Trigger sous MySQL quand on vient d'Oracle
    Bonjour,

    Je viens de changer de boulot et je passe de PHP/Oracle à VB.Net/MySQL5...

    Autant dire que c'est radical comme changement...

    Toujours est-il, j'essaie de créer mon premier trigger sous MySQL5 et je recontre des soucis... Alors, je vais vous expliquer ce que je veux obtenir et poster mon code...

    J'ai une table 'messages' et une table 'insultes'. Lors de l'insertion d'un message dans ma table 'messages', je veux, par l'intermédiaire d'un trigger before insert, comparer le texte de mon message à l'ensemble des occurences existantes dans ma table 'insultes', via une boucle, et le flaguer si la comparaison matche au moins une correspondance.

    Voici le code exact que je tente d'éxécuter dans MySQL Query Browser :
    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
    39
    40
    41
    42
     
    -- Trigger DDL Statements
    USE `gestion_messages`;
    DELIMITER //
    CREATE OR REPLACE TRIGGER `tg_filtr_insultes` BEFORE INSERT ON `messages`
      FOR EACH ROW
     
      BEGIN
     
      -- Déclare le curseur qui va lire la table des insultes répertoriées
      DECLARE cur1 CURSOR FOR SELECT libelle FROM insultes;
      -- Déclare et instancie la variable flag_insulte
      DECLARE flag_insulte INT DEFAULT 0;
      -- Déclare et instancie la variable flag_insulte_total (total boucle)
      DECLARE flag_insulte_total INT DEFAULT 0;
      -- Déclare la variable qui contiendra le libellé Insulte à comparer
      DECLARE libelle_insulte VARCHAR(45);
     
      -- Ouvre le curseur
      OPEN cur1;
     
      -- Démarre une boucle, lit la table insultes et compare libellé_message aux insultes répertoriées
      REPEAT
        FETCH cur1 INTO libelle_insulte;
           SELECT ' '.UCASE(TRIM(libelle_insulte)).' ' REGEXP ' '.UCASE(TRIM(NEW.texte_message)).' ' INTO flag_insulte;
           IF flag_insulte = 1 THEN
              flag_insulte_total = flag_insulte_total + flag_insulte;
           END IF;
      END REPEAT;
     
      -- Ferme le curseur
      CLOSE cur1;
     
        -- Si pas d'insulte trouvée => Flag affichage à 1, sinon Flag à 2
        IF flag_insulte_total = 0 THEN
            SET NEW.flag_affichage = 1;
        ELSE
            SET NEW.flag_affichage = 2;
        END IF;
     
    END//
    DELIMITER ;
    et voici le code d'erreur obtenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Script line: 4	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 'TRIGGER `tg_filtr_insultes` BEFORE INSERT ON `messages`
      FOR EACH ROW
     
      BEGIN
     
    ' at line 1
    Donc, en plus de m'aider à résoudre cette erreur qui parait simple mais pour la quelle rien de ce que je fais ne fonctionne, j'aimerai avoir votre avis sur mon code... Merci

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Salut,

    Idem, j'ai fait il y a longtemps du SQL Server, et il faut s'habituer à la syntaxe MySQL

    Moi, je suis dans les procédures stockées, les trigger ça y ressemble, pour les curseurs, dans mes exemples j'ai plus de lignes que toi :
    liées à DECLARE CONTINUE HANDLER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      DECLARE done INT DEFAULT 0;
      DECLARE cur CURSOR FOR SELECT DISTINCT `operator_name` FROM `packaging` where `operation_number`= operation;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
      ....
      OPEN cur;
      REPEAT
        FETCH cur INTO user_name;
        IF NOT done THEN
        .....
        .....
        END IF;
      UNTIL done END REPEAT;
      CLOSE cur;
    Sinon, c'est peut-etre mon manque d'expérience, mais je ne comprends pas le code qui est dans le FETCH.

  3. #3
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    Super, une première réponse

    Merci Fregolo.


    Alors, entre temps, j'ai constaté que j'aurais créé une boucle sans fin avec un repeat sans condition de sortie...

    Je reposte mon code au cas où :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    -- Trigger DDL Statements
    USE gestion_message;
    DELIMITER //
     
    CREATE TRIGGER tg_filtr_insult
    BEFORE INSERT ON message
    FOR EACH ROW
     
      BEGIN
     
        -- Déclare le curseur qui va lire la table des insultes répertoriées
        DECLARE cur1 CURSOR FOR SELECT libelle FROM insultes;
        -- Déclare et instancie la variable flag_insulte
        DECLARE flag_insulte INT DEFAULT 0;
        -- Déclare et instancie la variable flag_insulte_total (total boucle)
        DECLARE flag_insulte_total INT DEFAULT 0;
        -- Déclare la variable qui contiendra le libellé Insulte à comparer
        DECLARE libelle_insulte VARCHAR(45);
        -- Déclare la variable qui permettra d'interrompre la boucle
        DECLARE done INT DEFAULT 0;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     
        -- Ouvre le curseur
        OPEN cur1;
     
        -- Démarre une boucle, parse la table insultes et compare libellé message aux insultes répertoriées
        REPEAT
              FETCH cur1 INTO libelle_insulte;
              SELECT ' '.UCASE(TRIM(libelle_insulte)).' ' REGEXP UCASE(NEW.texte_message) INTO flag_insulte;
              IF flag_insulte = 1 THEN
                    flag_insulte_total = flag_insulte_total + flag_insulte;
              END IF;
        UNTIL done END REPEAT;
     
        -- Ferme le curseur
        CLOSE cur1;
     
        -- Si pas d'insulte trouvée => Flag affichage à 1, sinon Flag à 2
        IF flag_insulte_total = 0 THEN
            SET NEW.flag_affichage = 1;
        ELSE
            SET NEW.flag_affichage = 2;
        END IF;
     
      END//
     
    DELIMITER ;
    Si j'éxécute ça dans MySQL Query browser, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Script line: 5	Variable or condition declaration after cursor or handler declaration
    Error n°1337
    En fait, j'ai trituré le code dans tous les sens (avec et sans quotes....) et je ne trouve pas la solution à mon problème...

    Dans mon fetch, je cherche à utiliser une expression régulière pour matcher une correspondance entre la valeur de l'enregistrement en cours dans le curseur (libelle_insulte) et la chaine de mon message.
    J'utilise INTO flag_insulte pour récupérer le résultat renvoyé par l'expr. rég.
    Mais je ne sais pas si ça peut fonctionner, je suis dans les essais.

    Je n'ai pas mis de IF NOT DONE... C'est obligatoire ?

    Il n'y a pas l'air d'avoir foule sur ce forum...

  4. #4
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    Euh, si, une petite question encore...

    J'ai cru voir que le droit de créer un trigger devait être attribué aux utilisateurs... En l'occurence, GRANT SUPER pour MySQL 5.0 et GRANT TRIGGER pour la 5.1 et supérieure...

    Hors, je suis sur une 5.0.27, connecté en root, et je ne vois pas de droit SUPER (ni TRIGGER, ce qui me choque moins vu que c'est une 5.0.27) dans la liste des droits.

    Ma question est double :

    - Le fait d'être connecté root ne me dispense-t-il pas de devoir gérer les droits sur root, et, si besoin est, comment faire pour disposer de ce droit dans la liste des droits available ?

    (j'ai bien vu qu'il existe un script pour la modification des privilèges mais il semble qu'il ne doit être utilisé que pour une migration de MySQL 3,4 vers une 5)

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Il me semble que si tu as envie de virer des droits sur 'root', rien ne t'en empêche, mais il y a intérêt à avoir un autre super utilisateur avec les droits sur GRANT, si je pense que le serveur est figé dans sa config.

    Perso, sur mon PC de dév (Windows) j'ai installé wampserver et plusieurs version de MySQL. J'utilisais la 5.0.21, j'ai eu des pb avec les proc stockée, je suis passé à la 5.0.45. Ces 2 version ont les droits SUPER (vu dans phpMyAdmin).

    Sous Windows, j'utilise les clients lourds de MySQL (Admin, Query Browser ...), mais j'ai l'impression qu'il n'y a pas tout, donc je regarde avec le client léger phpMyAdmin.

    Suivant ce que tu fais, il faut utiliser soit l'un soit l'autre, toutes les fonctionnalités ne sont pas dispo dans les différents client.

Discussions similaires

  1. Editer un trigger sous mysql query
    Par valkiki dans le forum MySQL
    Réponses: 2
    Dernier message: 03/04/2009, 17h42
  2. aide creation trigger sous mysql
    Par bil.dev dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 09/02/2009, 00h18
  3. Trigger sous MySQL
    Par champijulie dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/04/2007, 11h57
  4. Trigger sous MySQL + calcul de TIME
    Par dragonfly dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 01/03/2007, 13h05
  5. Problème de Triggers sous Mysql 5
    Par petozak dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 14/08/2006, 11h18

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