|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() |
Bonjour.
Je viens de découvrir les triggers et désirant apprendre, j'essai dans créer un afin de prévenir l'insertion de valeurs négatives ou 0 dans une table en utilisant un trigger. table1 : col1 : Integer col2 : Varchar(32) Code :
INSERT INTO table1 (col1, col2) VALUES (1, 'azerty'); Code :
INSERT INTO table1 (col1, col2) VALUES (0, 'azerty'); Code :
UPDATE table1 SET col1 = -1, col2 = 'azerty' WHERE col1 = '1' AND col2 = 'azerty' Dans le cas de l'update je pense qu'il y aura un soucis de vérouillage de la table parceque j'ai ce genre de problème avec un trigger after update sur la table1. Merci. |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Tu n'as pas besoin de faire un trigger pour cela. Il suffit de rendre ton champ UNSIGNED. Ainsi, seul les valeurs >=0 peuventre être inséré.
Mais admettons : Il y a un autre problème. Tu modifies l'information après l'insertion. Il suffit d'executer le trigger en BEFOR UPDATE ou BEFOR INSERT. Tu contrôles avant qu'elle soit enregistré. Ainsi tu n'as pas à retourner dans la table pour modifier la données. Je rajouterais en plus que c'est pas trop possible.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() |
Merci.
Je fais ça pour apprendre à utiliser les triggers (c'est un exercice) parceque là je peine un peu. Je n'arrive pas à lui dire de rien faire, ou de détruire l'enregistrement dans le cas ou les conditions ne sont pas remplies. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Tu veux refuser l'enregistrement ou reformater la données mal formé ?
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() |
Je dirais les deux.
1 - Ne pas enregistrer si col1<=0 exemple : Code :
INSERT INTO table1 (col1, col2) VALUES (0, 'azerty'); 2 - Supprimer automatiquement un enregistrement quand la valeur de col1<=0 exemple : Code :
UPDATE table1 SET col1 = -1, col2 = 'azerty' WHERE col1 = '1' AND col2 = 'azerty' |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Tu ne peux pas empecher une opération d'écriture si elle a été lancé. Le trigger n'est pas tellement fait pour cela. Il faut dans ce cas là, il est préférable d'utiliser des procedures stockés.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
00
|
|
|
#7 | ||||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Cas 1/ le trigger ne peut EXPLICITEMENT refuser l'action. Par contre il peut la faire échouer, par ex. :
Code :
Code :
|
||||
|
|
00
|
|
|
#8 | |||
|
Membre du Club
![]() |
Merci pour l'information.
Là ça marche au niveau syntaxe, mais pas en fonctionnement. MySQL : 5.0.41 Code :
Citation:
|
|||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Normal car tu lui donne une chaine de caractère. Donc il te place un zero. Par contre, heureusement que Mysql est intelligent car en placant un zero il aurait pu tourner en rond.
Donc ce test montre bien que le trigger s'execute qu'une seul fois.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
00
|
|
|
#10 | ||||||
|
Membre du Club
![]() |
Ok.
Le Trigger dans ce cas remplace la valeur négative par une chaine de caractère, et il me semblait que le transtypage n'était pas automatique. Pour palier au problème je génère une erreur en appelant une procedure qui n'existe pas Code :
Citation:
Pour ce qui est de l'UPDATE : Code :
Citation:
|
||||||
|
|
00
|
|
|
#11 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Il y a un cas ou j'ai réussi à écrire dans une table concurrent. Je me rappelle pas trop comment j'ai réussi à m'en sortir. Bref, L'idée de provoquer une erreur n'est pas trop mal mais c'est une technique de cabot
J'ai rencontré le même problème que toi. J'ai résolu le problème en gérant toute les entrées de la base de données en passante par les procédures stocké. En gros, il n'est pas possible de faire des enregistrements directement sur une table. Il faut obligatoirement passer par une procédure stocké. Ainsi, tu peux contrôler les entrés.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
00
|
|
|
#12 |
|
Membre du Club
![]() |
Pas facile. au moins j'aurais appris des trucs sur les triggers. Maintenant je vais donc m'interresser aux procédures. En tout cas merci pour l'aide
.
|
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 982 ![]() |
Il est prévus que je fasse un article sur les Procédures stocké, Fonctions et Triggers.
Il y a des petites choses à savoir qui n'est pas forcément dit dans le documentation officiel.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com