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?
Respuesta
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.
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
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.
Sí, hay herramientas especializadas para este tipo de cosas: MySQL Debugger.
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
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. –
También encontré que esta herramienta es bastante útil para depurar mis procedimientos almacenados. – ralfe
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.
Difícil de encontrar en qué plataformas se ejecuta la herramienta de depuración. Parece correr en Windows. ¿Algo más? – Guy
La primera y estable depurador para MySQL está en dbForge Studio para MySQL
sapo MySQL. Hay una versión gratuita http://www.quest.com/toad-for-mysql/
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? –
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
tuve utilizar dos herramientas diferentes a los procedimientos y funciones de depuración:
- dbForge - muchos interfaz gráfica de usuario de MySQL en funcionamiento.
- MyDebugger - herramienta especializada para la depuración ... herramienta práctica para la depuración. vote http://tinyurl.com/voteimg
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?
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.
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
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? –
¡Genial! ¡¡Gracias!! – akelec
@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
Cómo depurar un MySQL procedimiento almacenado.
Mans Pobre depurador:
Crear una tabla llamada logtable con dos columnas,
id INT
ylog VARCHAR(255)
.Haga que la columna de identificación se autoincremente.
Utilice este procedimiento:
delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END
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.
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;
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.
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:
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
- 1. MySQL: ¿Cómo modificar los procedimientos almacenados atómicamente?
- 2. MySQL: Vistas vs Procedimientos almacenados
- 3. ¿Cómo llamo a los procedimientos almacenados de MySQL desde Perl?
- 4. ¿Cómo y cuándo mysql compila los procedimientos almacenados?
- 5. Eliminar todos los procedimientos almacenados en MySQL o usar procedimientos almacenados temporales
- 6. ¿En qué ubicación están almacenados los procedimientos recopilados de Mysql?
- 7. [MySQL]: Procedimientos almacenados y sentencias de selección
- 8. Permisos de procedimientos almacenados de MySQL
- 9. ¿Qué versión de MYSQL admite los procedimientos almacenados?
- 10. MYSQL Procedimientos almacenados Si enunciado Problema
- 11. ¿Cómo se depuran las funciones con postgres?
- 12. MySQL: instrucciones IF/THEN en procedimientos almacenados
- 13. ¿Cómo encontrar los procedimientos almacenados por nombre?
- 14. Ejecutar dispara procedimientos almacenados en SqlFiddle. Mysql
- 15. Versiones de procedimientos almacenados
- 16. ¿Cómo se depuran los Applets de Java?
- 17. ¿El SQL formado dinámicamente en los procedimientos almacenados niega el propósito mismo de los procedimientos almacenados?
- 18. ¿Cómo insertar/crear procedimientos almacenados en mySQL desde PHP?
- 19. ¿Cómo se depuran los sistemas operativos?
- 20. Procedimientos almacenados y funciones
- 21. Cómo usar los procedimientos almacenados con Symfony y Doctrine
- 22. Lista de procedimientos almacenados/funciones Línea de comandos de Mysql
- 23. ¿Escribir parámetros opcionales dentro de procedimientos almacenados en MySQL?
- 24. procedimientos almacenados con sqlAlchemy
- 25. ¡Los procedimientos almacenados se agotan de manera intermitente!
- 26. Cómo ejecutar procedimientos almacenados con Doctrine2 y MySQL
- 27. ¿Cuándo debo usar los procedimientos almacenados?
- 28. ¿Cómo migrar los procedimientos almacenados para probar db?
- 29. Patrones para procedimientos almacenados?
- 30. WebMatrix y procedimientos almacenados
¿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. –