Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/10/2006, 21h43   #1
Inscrit
 
Inscription : décembre 2004
Messages : 317
Détails du profil
Informations personnelles :
Âge : 23
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 317
Points : 437
Points : 437
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 :
 UPDATE gp_unt SET unt_nb = 0 WHERE unt_iuntid = 1 AND unt_legid = 1
J'ai cette erreur :
Citation:
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 :
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 :
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
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2006, 10h15   #2
Membre actif
 
Inscription : septembre 2003
Messages : 374
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 374
Points : 150
Points : 150
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 )
hpfx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2006, 16h19   #3
Inscrit
 
Inscription : décembre 2004
Messages : 317
Détails du profil
Informations personnelles :
Âge : 23
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 317
Points : 437
Points : 437
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 ?
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2006, 16h45   #4
Membre actif
 
Inscription : septembre 2003
Messages : 374
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 374
Points : 150
Points : 150
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.

Citation:
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...
hpfx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2006, 18h22   #5
Inscrit
 
Inscription : décembre 2004
Messages : 317
Détails du profil
Informations personnelles :
Âge : 23
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 317
Points : 437
Points : 437
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à :/
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 09h27   #6
Membre actif
 
Inscription : septembre 2003
Messages : 374
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 374
Points : 150
Points : 150
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 ?
hpfx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h04.


 
 
 
 
Partenaires

Hébergement Web