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 :

Problème de trigger


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut Problème de trigger
    Salut !

    Je commence à faire des triggers sous MySQL5, et je rencontre un petit problème. Le voici :

    J'ai une table, 3 colonnes, les 2 premières forment une clé unique
    J'ai une trigger qui, lors d'un update, supprime les lignes où la 3e colonne est à 0 (zero)

    Lorsque j'exécute cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     UPDATE gp_unt SET unt_nb = 0 WHERE unt_iuntid = 1 AND unt_legid = 1
    J'ai cette erreur :
    err no.1442 : Can't update table 'gp_unt' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
    Pour information voici la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE `gp_unt` (
      `unt_iuntid` tinyint(3) unsigned NOT NULL,
      `unt_legid` int(10) unsigned NOT NULL,
      `unt_nb` smallint(5) unsigned NOT NULL,
      PRIMARY KEY  (`unt_legid`,`unt_iuntid`),
      KEY `unt_nb` (`unt_nb`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Et le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TRIGGER gp_unt_zeros AFTER UPDATE ON gp_unt FOR EACH ROW
    DELETE FROM gp_unt WHERE NEW.unt_nb = 0
    En fait j'avais déjà eu cette erreur sur un update concernant une ligne qui avait déjà un 0 à la 3e colonne (je sais ca ne devrait pas exister avec le trigger !). J'ai résolu en mettant NEW.unt_nb = 0 au lieu de simplement unt_nb = 0 dans la condition du delete.

    Visiblement, il aime pas parce qu'il veut supprimer une ligne sur laquelle il est en train de travailler si j'ai bien compris. Mais comment lui dire qu'il doit quand même le supprimer ? Dans le trigger il y a bien "__AFTER__ UPDATE". Donc il devrait faire son update et ensuite le trigger, à savoir la suppression.
    Je comprend pas trop le comportement de MySQL là.

    Merci de m'éclairer !

    PS : remplacez le "SET unt_nb = 0" par "SET unt_nb = unt_nb - 15" (où 15 est la valeur précédente de unt_nb, mais ca je le sais pas) pour comprendre pourquoi je ne fais pas un DELETE directement

    PS2 : c'est mon unique trigger

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par winzou
    Visiblement, il aime pas parce qu'il veut supprimer une ligne sur laquelle il est en train de travailler si j'ai bien compris.
    Non d'apres le message il n'aime pas parce qu'il ne peux pas modifier la table(et non la ligne comme tu le penses) pour laquelle le triger *_UPDATE est actif.

    c'est un controle statique(*), qui verifie qu'il n'y ai pas de redondance cyclique.

    (*) static : dans le sens ou il ne cherche pas a comprendre ta requete, il vois simplement que des que ta table va être modifié il va declancher le trigger qui va modifier la même table qui va declancher le trigger qui va modifier qui va declancher qui va modifier qui va .... (bon j'arrete là, vous avez compris )

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Bah le truc c'est que mon trigger est un "AFTER UPDATE" et qu'il exécute un "DELETE".

    Donc l'exécution du trigger ne va rien déclencher du tout car je n'ai pas d'autre trigger (pas de "AFTER DELETE") !

    Il y a bien une solution d'esquive ?

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Je ne suis pas sur, mais j'ai cru lire il y a tres longtemps qu'il ne fallais pas confondre le UPDATE qui est dans le trigger et le UPDATE de l'ordre SQL.
    en gros, le trigger UPDATE n'est psa lancé QUE sur les ordre UPDATE.

    It is important to understand that the trigger_event does not represent a literal type of SQL statement that activates the trigger so much as it represents a type of table operation. For example, an INSERT trigger is activated by not only INSERT statements but also LOAD DATA statements because both statements insert rows into a table.
    http://dev.mysql.com/doc/refman/5.0/...e-trigger.html

    Ensuite, est-ce qu'il sont aussi lancé sur les DELETE ? il semble que non d'apres la doc...

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Ah une bonne chose à savoir ca.
    Mais bon je ne vois nul part que DELETE est considéré comme un UPDATE pour les triggers :/

    Pour en revenir à mon problème, comment je pourrais faire pour ne pas avoir de colonne à zero sans mettre une série de test coté application ?

    Si il me refuse mon trigger je vois pas trop là :/

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    En effet rien n'indique de le DELETE declanche le trigger autant pour moi.
    Mais visiblement (d'apres le message d'erreur qui est explicite) il ne veux pas que tu touche a la table qui a declanché le trigger...
    peut être dans une version ulterieur ?
    sinon, bah... comme tu l'as dis : dans l'application.

    ou peut être... simplement faire une procédure stocké que tu appelerait a la place de l'UPDATE.
    Et dans cette procedure tu fait l'update, suivis du delete.
    non ?

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

Discussions similaires

  1. PL/SQL problème sur Trigger
    Par kitsune dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/12/2005, 20h35
  2. [9i] problème avec trigger after logon
    Par Michael# dans le forum Oracle
    Réponses: 2
    Dernier message: 17/03/2005, 12h14
  3. [Interbase6] Problème de triggers
    Par emeraudes dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/03/2005, 09h52
  4. [SQLPLUS] - Problème de Triggers Java
    Par farcis dans le forum Oracle
    Réponses: 7
    Dernier message: 23/12/2004, 09h21
  5. [PL/SQL] problème de trigger
    Par Chuck67 dans le forum Oracle
    Réponses: 14
    Dernier message: 09/12/2004, 23h17

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