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 ne fonctionne pas


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 141
    Points : 73
    Points
    73
    Par défaut Trigger ne fonctionne pas
    Bonjour,

    On fait un exercice en classe et ça me prend la tête car la même syntaxe fonctionne chez tout le monde, sauf chez moi

    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
    CREATE DEFINER=`root`@`localhost` TRIGGER before_insert_client BEFORE INSERT
    ON agenda_en_ligne.client FOR EACH ROW
    BEGIN
     
        IF NEW.genre IS NOT NULL   
        AND NEW.genre != '1'       
        AND NEW.genre != '2'  
        AND NEW.genre != '3'
          THEN
            SET NEW.genre = '1';
        END IF;
     
    set new.date_creation=now();
     
    END
    Donc théoriquement, si le NEW.genre est différent de 1, 2 ou 3, il le set à 1.
    Sauf que j'ai ce message d'erreur systématiquement:
    Array ( [0] => HY000 [1] => 1366 [2] => Incorrect integer value: 'j' for column 'genre' at row 1 )
    Si vous pouviez m'aider.

    Merci

    A savoir qu'on ne voit pas le delimiter dans ce code. Voici le code que j'ai entré lorsque j'ai créé le trigger
    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
     
    DELIMITER |
    CREATE TRIGGER before_insert_client BEFORE INSERT
    ON agenda_en_ligne.client FOR EACH ROW
    BEGIN
     
        IF NEW.genre IS NOT NULL   
        AND NEW.genre != '1'       
        AND NEW.genre != '2'  
        AND NEW.genre != '3'
          THEN
            SET NEW.genre = '1';
        END IF;
     
    set new.date_creation=now();
     
    END |
     
    DELIMITER ;

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Es-tu certain que c'est le trigger qui déclenche cette erreur et pas les valeurs que tu essayes d'insérer dans ta table ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 141
    Points : 73
    Points
    73
    Par défaut
    Normalement je voulais utiliser le trigger pour que justement, si la valeur insérée dans le champ du formulaire n'est pas un entier compris entre 1 et 3, alors il le met par défaut à 1 avant de l'encoder dans la base de données.

    Donc il me retourne bien une erreur sur la valeur encodée, mais il devrait la convertir, théoriquement...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par peyau Voir le message
    Donc il me retourne bien une erreur sur la valeur encodée, mais il devrait la convertir, théoriquement...
    Ah la théorie... beau pays ! j'aimerai bien y vivre

    2 choses :
    * précédence des contrôles
    * conversions implicites

    * précédence des contrôles :
    Le type est toujours évalué en premier. Sur erreur de type les déclencheurs ne sont pas activés.
    Si ta colonne est en Int l'insertion de 'banane' génèrera une erreur de type.

    * conversions implicites
    SQLpro avait une "jolie" requête montrant les failles de MySQL à faire des conversions implicites.
    Le mode de stockage est assez simple au final :
    soit c'est du texte et la dé-codification du binaire se fait en ASCCII ou UNICOE.
    soit c'est du numérique et la dé-codification se fait en puissance de 2 ou de e
    soit c'est une date et c'est stocké en numérique avec un certain nombre de règles

    Si c'est une valeur alors on l'écrit tel quel. Exemple : 1
    Si c'est un texte alors on l'écrit entre apostrophes. Exemple : 'A'

    En écrivant le texte '1' en espérant avoir la valeur 1, on force à convertir le binaire implicitement.
    Et sous MySQL ça ne se passe pas toujours bien.
    Le savoir est une nourriture qui exige des efforts.

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 141
    Points : 73
    Points
    73
    Par défaut
    Ah... Il faudrait alors que je m'arrange pour que le champ n'accepte que les INT... C'est vrai que je n'ai pas tenté mon trigger sur une valeur INT autre que 1, 2 ou 3.

    Par soucis de facilité, je pourrais simplement remplacer le champ par un <select> et mettre les valeurs 1, 2 ou 3 mais... je n'aurais pas eu la réponse que je viens d'avoir!

    Merci en tout cas, je ne peux pas me permettre de tester maintenant mais je pense que ta réponse m'a suffisamment éclairé.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par peyau Voir le message
    je pourrais simplement remplacer le champ par un <select> et mettre les valeurs 1, 2 ou 3

    Moi ne pas avoir compris. toi expliquer ?
    Le savoir est une nourriture qui exige des efforts.

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 141
    Points : 73
    Points
    73
    Par défaut
    Ah oui oups, je ne parle que du SQL ici...

    Mais à la base, j'ai une page PHP reliée à la bdd, et j'utilise un formulaire pour envoyer les données dans la base de données.
    Donc pour l'instant, l'utilisateur entre lui même la valeur 1, 2 ou 3, en fonction de son genre (pourquoi utiliser un numéro? Pcq c'était la consigne du prof...) et pour l'instant le champ du formulaire est au type "text".
    Si je voulais me simplifier la vie, au lieu d'avoir ce champ, je pourrais mettre un <select> avec les valeurs 1, 2 et 3, pour que l'utilisateur ne puisse entrer rien d'autre que ces informations là

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut Peyau.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test`
    (  `id`          integer unsigned  not null auto_increment primary key,
       `libelle`     varchar(255)      not null,
       `genre`       tinyint unsigned      null default 1,
      `create_date`  TIMESTAMP(6)               default current_timestamp(6)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    drop trigger if exists `verifier`
    --------------
     
    --------------
    create trigger `verifier`
    before insert on `test`
    for each row
    begin
      set new.genre = if (new.genre >=1 and new.genre <=3, new.genre, 1);
    end
    --------------
     
    --------------
    insert into `test` (`libelle`,`genre`) values ('un',     default)
    --------------
     
    --------------
    insert into `test` (`libelle`,`genre`) values ('deux',   1)
    --------------
     
    --------------
    insert into `test` (`libelle`,`genre`) values ('trois',  2)
    --------------
     
    --------------
    insert into `test` (`libelle`,`genre`) values ('quatre', 3)
    --------------
     
    --------------
    insert into `test` (`libelle`,`genre`) values ('cinq',   NULL)
    --------------
     
    --------------
    insert into `test` (`libelle`,`genre`) values ('six',    99)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------+-------+----------------------------+
    | id | libelle | genre | create_date                |
    +----+---------+-------+----------------------------+
    |  1 | un      |     1 | 2019-05-10 13:25:46.579260 |
    |  2 | deux    |     1 | 2019-05-10 13:25:46.586580 |
    |  3 | trois   |     2 | 2019-05-10 13:25:46.606395 |
    |  4 | quatre  |     3 | 2019-05-10 13:25:46.617440 |
    |  5 | cinq    |     1 | 2019-05-10 13:25:46.641819 |
    |  6 | six     |     1 | 2019-05-10 13:25:46.678581 |
    +----+---------+-------+----------------------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Salut Artemus24,

    J'ai des questions, qui n'ont rien a voir avec ce post en particulier mais avec l'ensemble des scripts que tu poste, sur l'utilisation des transactions :
    -1- Pourquoi encadre tu ton script par une transaction ?
    -2- Pourquoi terminer par commit plutôt que Rollback ?
    Le savoir est une nourriture qui exige des efforts.

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut Michel.Priori.

    Citation Envoyé par Michel.Priori
    -1- Pourquoi encadre tu ton script par une transaction ?
    J'utilise un modèle que je reprends à chaque fois que je donne un exemple.

    Comme j'ai désactivé l'autocommit sous mysql, je préfère contrôler les validations ou les rejets.
    J'insère, quand cela est nécessaire, un "commit" ou un "rollback", selon les exemples.

    Citation Envoyé par Michel.Priori
    -2- Pourquoi terminer par commit plutôt que Rollback ?
    Si je ne mets pas de "commit", à la fin du script, aucune validation ne sera faite.
    A vrai dire, comme le script sert juste à donner un exemple, le commit final ne sert à rien.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Trigger ne fonctionnent pas
    Par DUALTECH dans le forum Bases de données
    Réponses: 8
    Dernier message: 19/05/2012, 13h57
  2. PB TRIGGER ne fonctionne pas
    Par pepitoluna dans le forum PL/SQL
    Réponses: 10
    Dernier message: 16/01/2011, 17h35
  3. TRIGGER ne fonctionne pas
    Par tonymontana4192 dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 05/08/2008, 22h31
  4. trigger ne fonctionnant pas
    Par kifouillou dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/02/2008, 18h42
  5. mon trigger ne fonctionne pas !
    Par japi33 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/03/2006, 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