Мой текущий процесс для отладки хранимых процедур очень прост. Я создаю таблицу под названием "debug", где я вставляю значения переменных из хранимой процедуры по мере ее запуска. Это позволяет мне видеть значение любой переменной в данной точке в script, но есть ли лучший способ отладки хранимых процедур MySQL?
Как вы отлаживаете хранимые процедуры MySQL?
Ответ 1
Я делаю что-то очень похожее на вас.
Обычно я включаю параметр DEBUG, который по умолчанию имеет значение false, и я могу установить значение true во время выполнения. Затем заверните операторы отладки в блок "If DEBUG".
Я также использую таблицу протоколирования со многими моими заданиями, чтобы я мог просматривать процессы и время. Мой отладочный код также выводится. Я включаю имя вызывающего пара, краткое описание, количество строк, затронутых (если необходимо), поле комментариев и отметку времени.
Хорошие инструменты отладки - одна из печальных ошибок всех платформ SQL.
Ответ 2
Следующая процедура debug_msg
может быть вызвана для простого вывода отладочного сообщения на консоль:
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
select concat('** ', msg) AS '** DEBUG:';
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 ;
Затем запустите тест следующим образом:
CALL test_procedure(1,2)
Это приведет к следующему выводу:
** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
Ответ 3
Да, для этого есть специальные инструменты - Отладчик MySQL.
Ответ 4
Существуют инструменты GUI для отладки хранимых процедур/функции и скрипты в MySQL. Достойный инструмент, который dbForge Studio для MySQL имеет богатую функциональность и стабильность.
Ответ 5
Отладка хранимой процедуры MySQL.
Отладчик бедных мужчин:
-
Создайте таблицу под названием logtable с двумя столбцами,
id INT
иlog VARCHAR(255)
. -
Создайте автоинкремент id столбца.
-
Используйте эту процедуру:
delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END
-
Поместите этот код в любом месте, где хотите записать сообщение в таблицу.
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
Это хороший быстрый и грязный маленький журнал, чтобы выяснить, что происходит.
Ответ 6
Отладчик для mysql был хорош, но он не был бесплатным. Это то, что я использую сейчас:
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$
Использование хранимой процедуры:
call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id));
использование хранимой процедуры:
call resetLog ();
call stored_proc();
select * from log;
Ответ 7
Здесь представлен другой способ
http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html
с настраиваемыми процедурами mySql отладки и протоколированием.
Вы также можете просто поместить простой код в свой код и посмотреть, выполняется ли он.
SELECT 'Message Text' AS `Title`;
Я получил эту идею от
http://forums.mysql.com/read.php?99,78155,78225#msg-78225
Также кто-то создал шаблон для пользовательских процедур отладки в GitHub.
Смотрите здесь
http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines
Здесь упомянут
Как поймать любое исключение в триггерах и хранить процедуры для mysql?
Ответ 8
Я просто просто размещаю инструкции выбора в ключевых областях хранимой процедуры, чтобы проверить текущее состояние наборов данных, а затем прокомментировать их (- select...) или удалить их перед производством.
Ответ 9
MySQL Connector/Net 6.6 имеет функцию Отладка хранимых процедур и функций
Установка отладчика
Чтобы включить отладчик хранимой процедуры:
- Для соединителя/сети 6.6: установите соединитель/сеть 6.6 и выберите вариант "Полный".
- Для Connector/Net 6.7 и более поздних версий: установите продукт MySQL для Visual Studio, к которому принадлежит отладчик хранимой процедуры.
Запуск отладчика
Чтобы запустить отладчик, выполните следующие действия:
- Выберите соединение в проводнике сервера Visual Studio.
- Разверните папку Хранимые процедуры. Только хранимые процедуры можно отлаживать напрямую. Чтобы отладить пользовательскую функцию, создайте сохраненную процедура, вызывающая функцию.
- Нажмите на хранимую процедуру node, затем щелкните правой кнопкой мыши и в контекстном меню выберите Debug Routine.
Ответ 10
Я опоздал на вечеринку, но принес больше пива:
http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ а также https://github.com/ocelot-inc/ocelotgui
Я попытался, и это кажется довольно стабильным, поддерживая контрольные точки и проверку переменных.
Это не полный набор (всего 4,1 Мб), но он мне очень помог!
Как это устроено: Он интегрируется с вашим клиентом mysql (я использую Ubuntu 14.04) и после выполнения:
$install
$setup yourFunctionName
Он устанавливает новую базу данных на вашем сервере, которая контролирует процесс отладки. Итак:
$debug yourFunctionName('yourParameter')
даст вам возможность шаг за шагом пройтись по коду, а "обновляя" свои переменные, вы сможете лучше увидеть, что происходит внутри вашего кода.
Важный совет: во время отладки, возможно, вы измените (заново создайте процедуру). После повторного создания выполните: $ exit и $ setup перед новым $ debug
Это альтернатива методам "insert" и "log". Ваш код не содержит дополнительных инструкций по отладке.
Снимок экрана:
Ответ 11
MySql Connector/NET также включает в себя отладчик хранимых процедур, интегрированный в Visual Studio начиная с версии 6.6, Вы можете получить установщик и исходный код здесь: http://dev.mysql.com/downloads/connector/net/
Некоторая документация/скриншоты: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html
Вы можете следить за анонсами здесь: http://forums.mysql.com/read.php?38,561817,561817#msg-561817
ОБНОВЛЕНИЕ: MySql для Visual Studio был разделен из Connector/NET на отдельный продукт, его можно выбрать (включая отладчик) здесь https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (все еще бесплатно и с открытым исходным кодом).
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я был разработчиком, который создал механизм отладчика хранимых процедур для продукта MySQL для Visual Studio.
Ответ 12
Первый и стабильный отладчик для MySQL находится в dbForge Studio for MySQL
Ответ 13
Я использовал два разных инструмента для отладки процедур и функций:
- dbForge - много функциональных GUI mysql.
- MyDebugger - специализированный инструмент для отладки... удобный инструмент для отладки. vote http://tinyurl.com/voteimg
Ответ 14
Toad mysql. Есть бесплатная версия http://www.quest.com/toad-for-mysql/
Ответ 15
Ответ, соответствующий этому @Brad Parks Не уверен в версии MySQL, но мой был 5.6, поэтому несколько настроек настройки:
Я создал функцию debug_msg
, которая является функцией (а не процедурой) и возвращает текст (без ограничения символа), а затем вызывает функцию как SELECT debug_msg
(params) AS my_res_set
, код, как показано ниже:
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
Ответ 16
Пользовательская переменная MySQL может быть использована в качестве выходных данных журнала:
DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
SET @stmt = CONCAT('SELECT * FROM ', tableName);
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
-- uncomment after debugging to cleanup
-- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;
выведет:
SELECT * FROM foo