2008-11-07 5 views
94

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

+1

Есть ли какие-либо варианты GUI для пользователей, не относящихся к Windows? Необходимость запуска копии Windows просто для отладки хранимых процедур - это немного скачок. И большинство параметров таблицы-вставки выходят из строя, если вы находитесь в транзакции, которую вы собираетесь откатить. – 2015-03-13 02:02:20

ответ

38

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

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

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

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

+2

Не все платформы @Bob Probst, инструменты отладки sybase тихие, приличные с отладочной точкой прерывания для триггера и хранимых процедур – Anup 2015-06-10 11:03:28

7

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

23

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

+4

Я так стремился попробовать. К сожалению, это полный обломки. Я получаю сообщение об ошибке «function coalesce does not exist» из-за mysql, в результате чего графический интерфейс неправильно обрабатывается с помощью кода SP (хотя MySQL работает правильно). Не говоря уже о локальных переменных «DECLARE var DEFAULT value». Они просто появляются как NULL, когда их явно нет. О, а также «Необъявленный идентификатор:« FETCH_RADIUS_DISTSORT », где это был скомпилированный оператор. Не рекомендуется. – kellogs 2013-10-08 02:26:09

+2

Это не идеально, но моя пробная версия с этим была совершенно другим опытом, о чем сообщал @kellogs выше. Инструмент приятный и легкий, и, похоже, он делает только работу без раздувания. Для меня это был гораздо лучший опыт, чем любой из других инструментов, опробованных (то есть Visual Studio, Toad и dbForge Studio, все из которых имели серьезные недостатки), будут описывать все это как «общий обломки» в сравнении). Не уверен, что это связано с тем, что отлаженная функция не включала какие-либо неисправные конструкции или были ли исправлены проблемы. – 2016-08-04 09:28:34

+0

Я также нашел, что этот инструмент очень полезен для отладки моих хранимых процедур. – ralfe 2017-06-07 09:42:09

21

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

+0

Трудно найти, на каких платформах работает инструмент отладки. Кажется, запускается в Windows. Что-нибудь еще? – Guy 2016-07-14 17:20:25

4

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

3

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

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

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

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

упоминался здесь

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

3

MySql Connector/NET также включает в себя отладчик хранимых процедур, встроенный в визуальной студии, начиная с версии 6.6, You может получить установщик и источник здесь: http://dev.mysql.com/downloads/connector/net/

Некоторые документация/скриншоты: https://dev.mysql.com/doc/connector-net/en/connector-net-visual-studio-debugger.html

Вы можете следить за здесь страниц объявлений: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

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

48

Следующая 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 
14

Как отлаживать MySQL хранимая процедура.

Бедный мужчин отладчик:

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

  2. Сделать идентификационный столбец автоинкремента.

  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)); 
    

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

7

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

MySQL Connector/Net 6.6 имеет функцию Debug Stored Procedures and Functions

Установка Отладчик

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

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

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

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

  • Выберите соединение в Visual Studio Server Explorer.
  • Разверните папку Хранимые процедуры. Только хранимые процедуры можно отлаживать напрямую. Чтобы отладить пользовательскую функцию, создайте сохраненную процедуру
    , вызывающую функцию.
  • Нажмите на узел хранимой процедуры, затем щелкните правой кнопкой мыши и в контекстном меню выберите Debug Routine.
5

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

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

я попробовал, и это выглядит довольно стабильной, поддерживая Breakpoints и Variable осмотр.

Это не полный набор (всего 4,1 Мб), но мне очень помог!

Как это работает: Он интегрируется с тузд клиента (я использую Ubuntu 14.04), и после того, как вы выполните:

$install 
$setup yourFunctionName 

Он устанавливает новую базу данных на вашем сервере, которые контролируют процесс отладки , Итак:

$debug yourFunctionName('yourParameter') 

даст вам шанс сделать шаг за шагом идти код, и «освежающий» переменные можно лучше видеть, что происходит внутри вашего кода.

Важный совет: при отладке, возможно, вы измените (заново создайте процедуру).После повторного создания выполните: $ exit и $ setup перед новым $ debug

Это альтернатива методам «вставки» и «регистрации». Ваш код не содержит дополнительных инструкций «отладки».

Скриншот:

ocelot breakpoint stepping

0

Ответ, соответствующий this по паркам @ Брэд Не уверен, что о версии MySQL, но мой был 5,6, следовательно, немного тонкой настройки работы:

Я создал function 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