2008-11-07 31 views
94

Mi proceso actual para depurar procedimientos almacenados es muy simple. Creo una tabla llamada "depuración" donde inserto valores variables del procedimiento almacenado mientras se ejecuta. Esto me permite ver el valor de cualquier variable en un punto dado del guión, pero ¿hay una mejor manera de depurar los procedimientos almacenados de MySQL?¿Cómo se depuran los procedimientos almacenados de MySQL?

+1

¿Hay alguna opción de GUI para usuarios que no usan Windows? Tener que ejecutar una copia de Windows solo para depurar los procedimientos almacenados es un poco exagerado. Y la mayoría de las opciones de inserción de tabla fallan si está en una transacción que está a punto de deshacer. –

Respuesta

38

Hago algo muy similar a ti.

Normalmente voy a incluir un parametro DEBUG que tiene el valor predeterminado en falso y puedo configurarlo en tiempo real. A continuación, ajuste las instrucciones de depuración en un bloque "If DEBUG".

También utilizo una tabla de registro con muchos de mis trabajos para poder revisar procesos y tiempos. Mi código Debug sale también allí. Incluyo el nombre del parámetro de llamada, una breve descripción, recuentos de filas afectados (si corresponde), un campo de comentarios y una marca de tiempo.

Buenas herramientas de depuración es uno de los tristes errores de todas las plataformas SQL.

+2

No todas las plataformas @Bob Probst, Sybase herramientas de depuración son tranquilas decente con punto de interrupción de depuración para el gatillo y procedimientos almacenados – Anup

7

Simplemente coloco declaraciones seleccionadas en áreas clave del procedimiento almacenado para verificar el estado actual de los conjuntos de datos, y luego comentarlos (--select ...) o eliminarlos antes de la producción.

23

Sí, hay herramientas especializadas para este tipo de cosas: MySQL Debugger.
enter image description here

+4

yo estaba tan ansioso por probarlo. Lamentablemente es un total de restos. Aparece un mensaje de error de "función coalesce no existe" supuestamente de mysql, como resultado, la GUI se bifurca incorrectamente a través del código SP (aunque MySQL lo ejecuta correctamente). Por no mencionar las variables locales "DECLARAR VALOR PREDETERMINADO". Simplemente aparecen como NULL cuando claramente no lo son. Ah, y también "identificador no declarado: 'FETCH_RADIUS_DISTSORT'" donde eso era una declaración compilada. No recomendado. – kellogs

+2

No es perfecto, pero mi prueba con esto ha sido una experiencia muy diferente a la reportada por @kellogs arriba. La herramienta es agradable y liviana y parece hacer el trabajo que se necesita sin ningún tipo de hinchazón. Fue una experiencia mucho mejor para mí que cualquiera de las otras herramientas probadas (es decir, Visual Studio, Toad y dbForge Studio, todas las cuales tenían fallas importantes; describirían todas estas como un "total de restos" en comparación). No estoy seguro de si esto se debe a que la función que se está depurando no incluyó ninguno de los constructos defectuosos o si los problemas se han solucionado. –

+0

También encontré que esta herramienta es bastante útil para depurar mis procedimientos almacenados. – ralfe

21

Hay GUI tools for debugging stored procedures/funciones y scripts en MySQL. Una herramienta decente que dbForge Studio for MySQL tiene una gran funcionalidad y estabilidad.

+0

Difícil de encontrar en qué plataformas se ejecuta la herramienta de depuración. Parece correr en Windows. ¿Algo más? – Guy

4

La primera y estable depurador para MySQL está en dbForge Studio para MySQL

1

sapo MySQL. Hay una versión gratuita http://www.quest.com/toad-for-mysql/

+1

He usado Toad durante años pero no sabía que tuviera características especiales para depurar sprocs. ¿Puedes aclarar cómo usas Toad para hacerlo? –

+0

Miró a Toad 6.3 para mysql en este momento, parece que hay una función de depuración con puntos de interrupción y todo. ¿Quiere decir que la función de depuración no funciona? ¿O tal vez su versión es anterior y no incluye la función de depuración? – Joyce

3

tuve utilizar dos herramientas diferentes a los procedimientos y funciones de depuración:

  1. dbForge - muchos interfaz gráfica de usuario de MySQL en funcionamiento.
  2. MyDebugger - herramienta especializada para la depuración ... herramienta práctica para la depuración. vote http://tinyurl.com/voteimg
8

Otra forma en que se presenta aquí

http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html

con los procedimientos de depuración de mySql personalizada y mesas de registro.

También puede simplemente colocar una simple selección en su código y ver si se ejecuta.

SELECT 'Message Text' AS `Title`; 

que tiene esta idea de

http://forums.mysql.com/read.php?99,78155,78225#msg-78225

también alguien creó una plantilla para depurar procedimientos personalizados en GitHub.

Vea aquí

http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines

se mencionó aquí

How to catch any exception in triggers and store procedures for mysql?

3

MySQL Connector/NET también incluye un depurador procedimiento almacenado integrado en Visual Studio partir de la versión 6.6, Usted puede obtener el instalador y la fuente aquí: http://dev.mysql.com/downloads/connector/net/

Algunos de documentación/screenshots: https://dev.mysql.com/doc/connector-net/en/connector-net-visual-studio-debugger.html

Puede seguir los annoucements aquí: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

Exención de responsabilidad: yo era el desarrollador que escribió el motor de procedimientos almacenados depurador para MySQL para el producto de Visual Studio.

48

El debug_msg siguiente procedimiento puede ser llamado simplemente salida de un mensaje de depuración en la consola:

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 ; 

A continuación, ejecute la prueba de la siguiente manera:

CALL test_procedure(1,2) 

el resultado será el siguiente resultado:

** DEBUG: 
** my first debug message 
** DEBUG: 
** arg1:1 
** DEBUG: 
** This message always shows up 
+6

Esto no parece funcionar para FUNCIONES y no tengo idea de por qué. Siempre da "Código de error: 1415. No se permite devolver un conjunto de resultados desde una función". ¿Hay algún recurso? –

+1

¡Genial! ¡¡Gracias!! – akelec

+1

@PatrickM Las funciones no pueden devolver filas ("resultado") mientras este procedimiento de depuración se basa en él (los mensajes de depuración son resultados devueltos en la llamada a procedimiento). En las funciones, solo puede 'INSERT INTO my_log_table (message) VALUES (msg) 'y tal vez recuperar todos los mensajes de depuración una vez que las llamadas a funciones hayan terminado (es decir: ha vuelto al procedimiento) – Xenos

14

Cómo depurar un MySQL procedimiento almacenado.

Mans Pobre depurador:

  1. Crear una tabla llamada logtable con dos columnas, id INT y log VARCHAR(255).

  2. Haga que la columna de identificación se autoincremente.

  3. Utilice este procedimiento:

    delimiter // 
    DROP PROCEDURE `log_msg`// 
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) 
    BEGIN 
        insert into logtable select 0, msg; 
    END 
    
  4. Pon este código en cualquier lugar que desee registrar un mensaje a la mesa.

    call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2)); 
    

Es un bonito y pequeño registrador rápida y sucia para averiguar lo que está pasando.

7

Debugger para mysql era bueno, pero no es gratis.Esto es lo que yo uso ahora:

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$ 

uso en procedimiento almacenado:

call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id)); 

uso de procedimiento almacenado:

call resetLog(); 
call stored_proc(); 
select * from log; 
6

MySQL Connector/Net 6.6 tiene una característica para Debug Stored Procedures and Functions

Instalación del depurador

Para activar el depurador de procedimiento almacenado:

  • Para Connector/Net 6.6: Instalar Connector/Net 6.6 y seleccione la opción Completa.
  • Para Connector/Net 6.7 y posterior: Instale el producto MySQL para Visual Studio, al que pertenece el depurador de procedimiento almacenado.

Inicio del depurador

Para iniciar el depurador, siga estos pasos:

  • elegir una conexión en el Visual Studio Explorador de servidores.
  • Expande la carpeta Procedimientos almacenados. Solo los procedimientos almacenados se pueden depurar directamente. Para depurar una función definida por el usuario, cree un procedimiento almacenado
    que llame a la función.
  • Haga clic en un nodo de procedimiento almacenado, luego haga clic derecho y desde el menú contextual seleccione la rutina de depuración.
5

llego tarde a la fiesta, pero trajo más cerveza:

http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ y https://github.com/ocelot-inc/ocelotgui

he intentado, y parece bastante estable, el apoyo a los puntos de interrupción y la inspección variable.

No es una suite completa (solo 4,1 Mb) pero me ayudó mucho.

Cómo funciona: Se integra con su cliente MySQL (estoy usando Ubuntu 14.04), y después de ejecutar:

$install 
$setup yourFunctionName 

Se instala una nueva base de datos en el servidor, que controlan el proceso de depuración . Por lo tanto:

$debug yourFunctionName('yourParameter') 

le dará la oportunidad de caminar paso a paso el código, y "refrescante" las variables que mejor puede ver lo que está sucediendo dentro de su código.

Consejo importante: durante la depuración, quizás cambie (vuelva a crear el procedimiento).Después de una recreación, ejecute: $ exit y $ setup antes de una nueva $ debug

Esta es una alternativa a los métodos de "inserción" y "registro". Su código permanece libre de instrucciones adicionales de "depuración".

Captura de pantalla:

ocelot breakpoint stepping

0

respuesta correspondiente a this por Parques @Brad No está seguro acerca de la versión de MySQL, pero la mía era de 5,6, por lo tanto, un poco de ajuste bits funciona:

he creado una función debug_msg que es función (no procedimiento) y devuelve texto (sin límite de caracteres) y luego llama a la función como SELECCIONAR debug_msg (params) AS my_res_set, código de la siguiente manera:

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 
Cuestiones relacionadas