Как вы отлаживаете хранимые процедуры MySQL?



мой текущий процесс отладки хранимых процедур очень прост. Я создаю таблицу под названием "debug", где я вставляю значения переменных из хранимой процедуры по мере ее выполнения. Это позволяет мне видеть значение любой переменной в заданной точке скрипта, но есть ли лучший способ отладки хранимых процедур MySQL?

712   15  

15 ответов:

Я делаю что-то очень похожее на вас.

обычно я включаю параметр отладки, который по умолчанию имеет значение false, и я могу установить значение true во время выполнения. Затем оберните операторы отладки в блок "if DEBUG".

Я также использую таблицу ведения журнала со многими из моих заданий, чтобы я мог просматривать процессы и сроки. Мой отладочный код также выводится там. Я включаю имя вызывающего параметра, краткое описание, количество затронутых строк (если это необходимо), поле комментариев и время печать.

хорошие инструменты отладки является одним из печальных недостатков всех платформ SQL.

следующее 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 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 ;

затем запустите тест следующим образом:

CALL test_procedure(1,2)

это приведет к следующему результату:

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

Да, есть специальные инструменты для такого рода вещей - MySQL Debugger.
enter image description here

здесь GUI инструменты для отладки хранимых процедур / функции и скрипты в MySQL. Достойный инструмент, который dbForge Studio for MySQL, обладает богатой функциональностью и стабильностью.

как отладить хранимую процедуру MySQL.

бедняга отладчик:

  1. создайте таблицу logtable с двумя столбцами,id INT и log VARCHAR(255).

  2. сделайте автоинкремент столбца id.

  3. используйте эту процедуру:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
    
  4. поместите этот код в любое место, где вы хотите записать сообщение в таблицу.

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

это a хороший быстрый и грязный маленький лесоруб, чтобы выяснить, что происходит.

здесь представлен другой способ

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?

отладчик для 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;

Я просто помещаю инструкции select в ключевые области хранимой процедуры, чтобы проверить текущее состояние наборов данных, а затем закомментировать их (--select...) или извлекайте их перед продукцией.

MySQL Connector / Net 6.6 имеет функцию отладка хранимых процедур и функций

установка отладчика

включить отладчик хранимых процедур:

  • для соединителя / сети 6.6: установите соединитель / сеть 6.6 и выберите полный вариант.
  • для Connector / Net 6.7 и более поздних версий: установите продукт MySQL для Visual Studio, к которому относится отладчик хранимых процедур принадлежать.

запуск отладчика

чтобы запустить отладчик, выполните следующие действия:

  • выберите соединение в Обозревателе серверов Visual Studio.
  • разверните папку хранимые процедуры. Только хранимые процедуры могут быть отлажены непосредственно. Чтобы отладить пользовательскую функцию, создайте хранимую
    процедура, которая вызывает функцию.
  • щелкните узел хранимой процедуры, затем щелкните правой кнопкой мыши и в контекстном меню выберите пункт Отладка процедуры.

Я опоздал на вечеринку, но принес еще пива:

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". Ваш код остается свободным от дополнительных инструкций "отладки".

скриншоты:

ocelot breakpoint stepping

первый и стабильный отладчик для MySQL находится в dbForge Studio for MySQL

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

вы можете следить за annoucements здесь: http://forums.mysql.com/read.php?38,561817,561817#МСГ-561817

обновление: MySql для Visual Studio был разделен из Connector / NET в отдельный продукт, вы можете выбрать его (включая отладчик) отсюда https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (по-прежнему бесплатно и с открытым исходным кодом).

отказ от ответственности: я был разработчиком, который создал механизм отладчика хранимых процедур для MySQL для продукта Visual Studio.

Я использовал два разных инструмента для отладки процедур и функций:

  1. dbForge-много функциональных графических интерфейсов mysql.
  2. MyDebugger-специализированный инструмент для отладки ... удобный инструмент для отладки.голосовать http://tinyurl.com/voteimg

жаба mysql. Существует бесплатная версия http://www.quest.com/toad-for-mysql/

ответ, соответствующий этой by @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

Comments

    Ничего не найдено.