j'ai une procédure stockée qui effectue une operation telle que
UPDATE time_reporting_table SET temps = temps + var_temps WHERE id = var_id
Dans cette table time_reporting_table (table de type myIsam), le champ temps est défini comme suit
TIME NOT NULL DEFAULT '00:00:00'
une fois passée la procédure stockée en prod, j'ai observé sur certains appels l'erreur mysql
Truncated incorrect time value: '1095:16:32'
Après consultation dans la doc, effectivement la valeur max du type TIME est de +/- 838:59:59
source:
1 2 3 4 5 6 7 8 9
| mysql> select TIME('1000:00:00');
+--------------------+
| TIME('1000:00:00') |
+--------------------+
| 838:59:59 |
+--------------------+
1 row in set, 1 warning (0.00 sec)
mysql> |
Donc si on appelle la procédure stockée en question en essayant d'ajouter 10 minutes alors que la colonne contient par exemple 838:55:59, la somme des deux temps va dépasser le max, donc mysql va être obligé de tronquer à 838:59:59. donc avertissement. etc.
==> 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.
GRANT ALL PRIVILEGES ON `madatabase`.* TO 'monuser'@'%' WITH GRANT OPTION
c'est le même nom de user en test et en prod (mais pas le mm server (windows VS linux) + pas la mm version de mysqld et pas le même nom de base)
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| mysql> select version();
+---------------------+
| version() |
+---------------------+
| 5.0.67-community-nt |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT @@GLOBAL.sql_mode;
+----------------------------------------------------------------+
| @@GLOBAL.sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@SESSION.sql_mode;
+----------------------------------------------------------------+
| @@SESSION.sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec) |
TEST
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| mysql> select version();
+---------------------+
| version() |
+---------------------+
| 5.1.41-3ubuntu12.10 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT @@GLOBAL.sql_mode;
+-------------------+
| @@GLOBAL.sql_mode |
+-------------------+
| |
+-------------------+
1 row in set (0.00 sec)
mysql> SELECT @@SESSION.sql_mode;
+--------------------+
| @@SESSION.sql_mode |
+--------------------+
| |
+--------------------+
1 row in set (0.00 sec) |
Partager