web-dev-qa-db-fra.com

Comment déboguez-vous les procédures stockées MySQL?

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?

115
Cory House

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.

41
Bob Probst

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
59
Brad Parks

Oui, il existe des outils spécialisés pour ce genre de choses - MySQL Debugger .
enter image description here

28
George

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.

21
Josef Miran

Comment déboguer une procédure stockée MySQL.

Pauvre débogueur de l'homme:

  1. Créez une table appelée logtable avec deux colonnes, id INT Et log VARCHAR(255).

  2. Rendre la colonne id auto-incrémentée.

  3. Utilisez cette procédure:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
    
  4. 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.

19
Eric Leschinski

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;
9
Tone Škoda

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?

8
Jeremy S.

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.

7
Ash Machine

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:

ocelot breakpoint stepping

6
Marcelo Amorim

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.
6
Rahul Tripathi

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

4
Zoitc2014

J'avais utilisé deux outils différents pour déboguer les procédures et les fonctions:

  1. dbForge - beaucoup d’interfaces utilisateur mysql fonctionnelles.
  2. MyDebugger - outil spécialisé pour le débogage ... outil pratique pour le débogage . vote http://tinyurl.com/voteimg
3
GeoGo

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
1
aniruddha

Crapaud mysql. Il existe une version gratuite http://www.quest.com/toad-for-mysql/

1
Joyce