web-dev-qa-db-fra.com

Imprimer les informations de débogage à partir d'une procédure stockée dans MySQL

MySQL peut-il imprimer des messages de débogage sur stdout, tentemptable ou logfile? Quelque chose comme:

  • print dans SQLServer
  • DBMS_OUTPUT.PUT_LINE dans Oracle
61
Peanut

Option 1: Mettez ceci dans votre procédure pour imprimer le 'commentaire' sur la sortie standard lors de l'exécution.

SELECT 'Comment';

Option 2: Mettez ceci dans votre procédure pour imprimer une variable avec elle sur stdout:

declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);

Ceci affiche myvar is 5 sur stdout lors de l'exécution de la procédure.

Option 3, Créer une table avec une colonne de texte appelée tmptable et envoyer des messages à cette dernière:

declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);

Vous pouvez mettre ce qui précède dans une procédure stockée, de sorte que tout ce que vous auriez à écrire est le suivant:

CALL log(concat('the value is', myvar));

Ce qui évite quelques frappes.

Option 4, Enregistrer les messages dans un fichier

select "penguin" as log into outfile '/tmp/result.txt';

Il y a de très fortes restrictions sur cette commande. Vous pouvez uniquement écrire le fichier de sortie dans des zones du disque qui accordent des autorisations de création et d'écriture au groupe "autres". Cela devrait fonctionner en le sauvegardant dans le répertoire/tmp. 

De plus, une fois que vous avez écrit le fichier de sortie, vous ne pouvez pas l'écraser. Cela empêche les pirates de rooter votre ordinateur simplement parce qu’ils ont injecté du code SQL sur votre site Web et qu’ils peuvent exécuter des commandes arbitraires dans MySQL.

88
Patrick

Une solution de contournement consiste à utiliser select sans autres clauses.

http://lists.mysql.com/mysql/197901

6
b8b8j

Je crée habituellement une table de journalisation avec une procédure stockée pour la journalisation. Appelez la procédure de journalisation, le cas échéant, à partir de la procédure en cours de développement. 

En regardant autres messages sur cette même question, cela semble être une pratique courante, bien qu'il existe quelques alternatives.

5
Rob Cooke

Un moyen rapide d’imprimer quelque chose est:

select '** Place your mesage here' AS '** DEBUG:';
0
Roberto Rodriguez