|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre habitué
![]() Inscription : février 2004 Messages : 318 ![]() |
j'ai une procédure stockée qui effectue une operation telle que
Code :
UPDATE time_reporting_table SET temps = temps + var_temps WHERE id = var_id une fois passée la procédure stockée en prod, j'ai observé sur certains appels l'erreur mysql Code :
Truncated incorrect time value: '1095:16:32'
source: Code :
==> jusque là : pas de question. ce que je ne comprends pas bien, c'est que j'avais bien anticipé cette source d'erreur et j'ai même fait des tests unitaires exposant cette limitation. Or les tests unitaires ne lèvent pas d'exception (la valeur est silencieusement tronquée). Par contre, en prod j'ai une erreur qui a pour effet que l'insertion échoue (pas de temps ajouté) au lieu d’être silencieusement tronquée à 838:59:59 Les droits mysql du user qui crée les procédures stockées, qui les exécute, sont les mêmes en prod et en test. Code :
GRANT ALL PRIVILEGES ON `madatabase`.* TO 'monuser'@'%' WITH GRANT OPTION lorsque je recharge la base de prod dans la base test (en prenant soin de virer les directive DEFINER= de la création de procédure stockée) ==> je répète le comportement en test. à ce stade, si je relance mes scripts de création de procédure stockée sur l'environnement de test, l'erreur disparait à nouveau. ==> même en relançant en prod mes commandes SQL de création de procédures stockées, je n'arrive pas à me débarrasser de l'erreur j'ai cherché dans les variables de session, qqch qui pourrait expliquer par exemple qu'un warning soit considéré comme une erreur. A l’exception de sql_mode (voir plus bas), je n'ai rien trouvé. Je viens de repasser toute la faq mysq de dvp sans succès. J'ai cherché dans le forum, à part http://www.developpez.net/forums/d98...alue-avg-time/ qui ne répond pas à mon problème ==> rien trouvé. ma question: qu'est-ce qui peut expliquer ce comportement? (troncature silencieusement effectuée VERSUS erreur) je pense à STRICT_TRANS_TABLES mais dans ce cas, pourquoi le reload des procédures fait disparaitre l'erreur en test mais pas en prod??? ![]() ![]() qqs info d'environnement PROD Code :
Code :
|
||||||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
Ton environnement de production est en 5.0, alors que ton environnement de test est en 5.1. Si tu repasses ton environnement de test en 5.0, est-ce que tu obtiens le même comportement qu'en prod ? Pour moi, la réponse est très certainement là...
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : février 2004 Messages : 318 ![]() |
mmm.. je vais la tenter pour voir.
de tte facon, le moyen le plus simple et le plus sur est tout simplement de cesser d'utiliser un type (TIME) dont je sais que les valeurs limites ne matchent pas avec les valeurs effectivement rencontrées. par exemple utiliser INT et compter des secondes par contre changer de type va me casser bcp de trucs à coté, je vais avoir pas mal de maintenance sur les tests. mais au fond, tout ca est acceptable. je n'avais qu'à mieux anticiper c'est tout. ce qui me gene surtout c'est de faire face à une erreur sans pouvoir l'expliquer les différences de comportement. ca ca craint vraiment. ps: oui je sais c'est pas bien d'avoir des environnements de test & prod différents. je n'ai pas eu le choix c'est tout :'( |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
|
|
|
00
|
|
|
#5 | |
|
Membre habitué
![]() Inscription : février 2004 Messages : 318 ![]() |
Citation:
NB: je passe le dump à sed pour lui virer les DEFINER=bidule sinon j'ai d'autres problemes par ailleurs ==> je reproduis le probleme sur l'environnement de test, malgré le sql_mode vide en test contre mis à STRICT_TRANS_TABLES en prod 1. déjà là je ne comprends pas. pour moi le comportement attendu c'est que l'erreur ne se reproduit pas du tout en test vu qu'il n'y a pas le STRICT_TRANS_TABLES A ce stade, si je remet toutes mes fichiers.sql contenant les procédures stockées sur mon mysqld de test. (cat script.sql | mysql bla bla bla) ==> le bug disparait en test 2. le comportement attendu serait que ca continue de bugguer vu que les procédures stockées étaient les memes avant et après leur écrasement... j'y comprends rien |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com