Mon processus actuel de débogage des procédures stockées est très simple. Je crée une table appelée "debug" dans laquelle j'insère des valeurs de variable à partir de la procédure stockée lorsqu'elle est exécutée. Cela me permet de voir la valeur de n'importe quelle variable à un moment donné du script, mais existe-t-il un meilleur moyen de déboguer les procédures stockées MySQL?
Je fais quelque chose de très similaire à vous.
J'inclus généralement un paramètre DEBUG dont la valeur par défaut est false et que je peux définir sur true au moment de l'exécution. Emballez ensuite les instructions de débogage dans un bloc "If DEBUG".
J'utilise également une table de journalisation avec plusieurs de mes travaux afin de pouvoir examiner les processus et le calendrier. Mon code de débogage est également affiché ici. J'inclus le nom du paramètre appelant, une brève description, le nombre de lignes affectées (le cas échéant), un champ de commentaires et un horodatage.
Un bon outil de débogage est l’un des tristes échecs de toutes les plateformes SQL.
Le suivant debug_msg
procédure peut être appelée pour simplement envoyer un message de débogage à la console:
DELIMITER $$
DROP PROCEDURE IF EXISTS `debug_msg`$$
DROP PROCEDURE IF EXISTS `test_procedure`$$
CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
IF enabled THEN BEGIN
select concat("** ", msg) AS '** DEBUG:';
END; END IF;
END $$
CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER)
BEGIN
SET @enabled = TRUE;
call debug_msg(@enabled, "my first debug message");
call debug_msg(@enabled, (select concat_ws('',"arg1:", arg1)));
call debug_msg(TRUE, "This message always shows up");
call debug_msg(FALSE, "This message will never show up");
END $$
DELIMITER ;
Puis lancez le test comme ceci:
CALL test_procedure(1,2)
Il en résultera la sortie suivante:
** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
Oui, il existe des outils spécialisés pour ce genre de choses - MySQL Debugger .
Il y a outils graphiques pour le débogage des procédures stockées /fonctions et scripts dans MySQL. DbForge Studio for MySQL est un outil décent, doté de fonctionnalités et d’une stabilité optimales.
Comment déboguer une procédure stockée MySQL.
Pauvre débogueur de l'homme:
Créez une table appelée logtable avec deux colonnes, id INT
Et log VARCHAR(255)
.
Rendre la colonne id auto-incrémentée.
Utilisez cette procédure:
delimiter //
DROP PROCEDURE `log_msg`//
CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
BEGIN
insert into logtable select 0, msg;
END
Placez ce code partout où vous souhaitez enregistrer un message sur la table.
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
C'est un gentil petit enregistreur rapide et sale qui sait ce qui se passe.
Le débogueur pour mysql était bon mais ce n’est pas gratuit. C'est ce que j'utilise maintenant:
DELIMITER GO$
DROP PROCEDURE IF EXISTS resetLog
GO$
Create Procedure resetLog()
BEGIN
create table if not exists log (ts timestamp default current_timestamp, msg varchar(2048)) engine = myisam;
truncate table log;
END;
GO$
DROP PROCEDURE IF EXISTS doLog
GO$
Create Procedure doLog(in logMsg nvarchar(2048))
BEGIN
insert into log (msg) values(logMsg);
END;
GO$
Utilisation dans une procédure stockée:
call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id));
utilisation de procédure stockée:
call resetLog ();
call stored_proc();
select * from log;
Une autre façon est présentée ici
http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html
avec les procédures de débogage personnalisées mySql et les tables de journalisation.
Vous pouvez également simplement placer une sélection simple dans votre code et voir si elle est exécutée.
SELECT 'Message Text' AS `Title`;
J'ai eu cette idée de
http://forums.mysql.com/read.php?99,78155,78225#msg-78225
En outre, quelqu'un a créé un modèle pour les procédures de débogage personnalisées sur GitHub.
Vois ici
http://www.bluegecko.net/mysql/debugging-stored-procedures/https://github.com/CaptTofu/Stored-procedure-debugging-routines
A été mentionné ici
Comment attraper une exception dans les triggers et les procédures de stockage pour mysql?
Je place simplement des instructions select dans des zones clés de la procédure stockée pour vérifier l'état actuel des ensembles de données, puis les commenter (--sélectionner ...) ou les supprimer avant la production.
Je suis en retard à la fête, mais j'ai apporté plus de bière:
http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ et https://github.com/ocelot-inc/ocelotgui
J'ai essayé, et cela semble assez stable, de supporter les points d'arrêt et le contrôle variable.
Ce n'est pas une suite complète (seulement 4,1 Mo) mais m'a beaucoup aidé!
Comment ça marche: Il s'intègre à votre client mysql (j'utilise Ubuntu 14.04), et après avoir exécuté:
$install
$setup yourFunctionName
Il installe une nouvelle base de données sur votre serveur, qui contrôle le processus de débogage. Alors:
$debug yourFunctionName('yourParameter')
vous donnera une chance de parcourir pas à pas votre code et, en "rafraîchissant" vos variables, vous pourrez mieux voir ce qui se passe dans votre code.
Conseil important: lors du débogage, vous pourrez peut-être changer (recréer la procédure). Après une re-création, exécutez: $ exit et $ setup avant un nouveau $ debug
C'est une alternative aux méthodes "insert" et "log". Votre code reste libre d'instructions supplémentaires de "débogage".
Capture d'écran:
MySQL Connector/Net 6.6 a une fonctionnalité pour Déboguer les procédures et fonctions stockées
Installation du débogueur
Pour activer le débogueur de procédure stockée:
- Pour Connector/Net 6.6: Installez Connector/Net 6.6 et choisissez l’option Complete.
- Pour Connector/Net 6.7 et versions ultérieures: Installez le produit MySQL pour Visual Studio, auquel appartient le débogueur de procédure stockée.
Démarrer le débogueur
Pour démarrer le débogueur, procédez comme suit:
- Choisissez une connexion dans l'explorateur de Visual Studio Server.
- Développez le dossier Procédures stockées. Seules les procédures stockées peuvent être déboguées directement. Pour déboguer une fonction définie par l'utilisateur, créez un
procédure qui appelle la fonction.- Cliquez sur un nœud de procédure stockée, puis cliquez avec le bouton droit et, dans le menu contextuel, choisissez Routine de débogage.
MySql Connector/NET inclut également un débogueur de procédures mémorisées intégré à Visual Studio à partir de la version 6.6. Vous pouvez obtenir le programme d'installation et le source ici: http://dev.mysql.com/downloads/connector/net/
Quelques documentations/captures d'écran: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html
Vous pouvez suivre les annonces ici: http://forums.mysql.com/read.php?38,561817,561817#msg-561817
MISE À JOUR: Le MySQL pour Visual Studio a été scindé de Connector/NET en un produit distinct, vous pouvez le sélectionner (y compris le débogueur) à partir d'ici https://dev.mysql.com/downloads/windows/visualstudio/1.2 .html (encore libre et open source).
AVERTISSEMENT: J'étais le développeur qui a créé le moteur de débogage de procédures stockées pour le produit MySQL for Visual Studio.
Le premier débogueur stable pour MySQL se trouve dans dbForge Studio for MySQL
J'avais utilisé deux outils différents pour déboguer les procédures et les fonctions:
Réponse correspondant à this par @Brad Parks Pas sûr de la version de MySQL, mais la mienne était de 5,6, donc un peu de peaufinage:
J'ai créé une fonction debug_msg
qui est une fonction (pas une procédure) et renvoie du texte (sans limite de caractères), puis appelle la fonction en tant que SELECT debug_msg
_ (params) AS my_res_set
, code comme ci-dessous:
CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1
READS SQL DATA
BEGIN
IF enabled=1 THEN
return concat('** DEBUG:', "** ", msg);
END IF;
END
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`(
IN RegionID VARCHAR(20),
IN RepCurrency INT(11),
IN MGID INT(11),
IN VNC VARCHAR(255)
)
BEGIN
SET @enabled = TRUE;
SET @mainQuery = "SELECT * FROM Users u";
SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`;
SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30);
SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`;
END $$
DELIMITER
Crapaud mysql. Il existe une version gratuite http://www.quest.com/toad-for-mysql/