Як ви налагоджуєте збережені MySQL процедури?


125

Мій поточний процес налагодження збережених процедур дуже простий. Я створюю таблицю під назвою "налагодження", куди я вставляю змінні значення зі збереженої процедури під час її запуску. Це дозволяє мені бачити значення будь-якої змінної в заданій точці сценарію, але чи є кращий спосіб налагодження збережених процедур MySQL?


2
Чи є варіанти GUI для користувачів, які не є Windows? Потрібно запустити копію Windows просто для налагодження збережених процедур. І більшість параметрів вставки в таблицю не вдається, якщо ви здійснюєте транзакцію, яку ви збираєтеся відкатати.
Кодовий мерзотник

Відповіді:


44

Я роблю щось з тобою дуже схоже.

Я зазвичай включаю параметр DEBUG, який за замовчуванням встановлює значення false, і я можу встановити значення true на час виконання. Потім загортайте заяви про налагодження в блок "If DEBUG".

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

Хороший інструмент налагодження - один із сумних недоліків усіх платформ SQL.


3
Не на всіх платформах @Bob Probst інструменти для налагодження sybase пристойні з налагодженням точки відключення для тригера та збережених процедур
Anup

69

Наступна 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

8
Це, здається, не працює для ФУНКЦІЙ, і я не знаю, чому. Він завжди дає "Код помилки: 1415. Не дозволяється повертати набір результатів з функції". Чи є регрес?
Патрік М

1
@PatrickM Функції не можуть повернути рядки ("результат"), поки ця процедура налагодження покладається на неї (повідомлення про налагодження - це набори результатів, повернені під час виклику процедури). У функціях ви можете лише INSERT INTO my_log_table (message) VALUES (msg)і, можливо, отримувати всі повідомлення про налагодження, як тільки виклики функцій закінчуються (тобто: ви знову в процедурі)
Xenos

Цей підхід хороший, але запис на консоль не ефективний на MySQL Workbench, як IDE. тому що кожен оператор "select" відкриває нову панель результатів. Думаю, що краще створити тимчасову таблицю журналів для реєстрації повідомлень про помилки з позначкою часу та назвою процедури
mustafa kemal tuna

28

Так, є спеціалізований інструмент для такого роду речей - MySQL Debugger .
введіть тут опис зображення


5
я так хотів спробувати це. На жаль, це тотальна уламка. Я отримую повідомлення про помилку "функція coalesce не існує" з mysql, в результаті графічний інтерфейс неправильно розгалужується через SP-код (хоча MySQL запускає його правильно). Не кажучи вже про локальні змінні "DECLARE var DEFAULT value". Вони просто відображаються як NULL, коли їх явно немає. О, а також "Недекларований ідентифікатор:" FETCH_RADIUS_DISTSORT "", де це було складене твердження. Не рекомендовано.
kellogs

4
Це не ідеально, але мій випробування з цим було зовсім іншим досвідом, ніж той, про який повідомляв @kellogs вище. Інструмент хороший і легкий і, здається, виконує просто необхідну роботу без жодного нальоту. Для мене це було набагато кращим досвідом, ніж будь-який інший інструментарій (тобто Visual Studio, Toad і dbForge Studio, які мали основні недоліки - описував би все це як "повну уламку" порівняно). Не впевнений, чи це тому, що налагоджена функція не включала жодну з несправних конструкцій чи не виправлені проблеми.
Стів Чемберс

2
Я також вважав, що цей інструмент є досить корисним для налагодження збережених процедур.
ralfe

22

Як налагодити збережену процедуру MySQL.

Бідний налагоджувач Mans:

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

Приємний швидкий і брудний маленький лісоруб, щоб зрозуміти, що відбувається.


21

У MySQL є інструменти GUI для налагодження збережених процедур / функцій та скриптів. Гідний інструмент, який dbForge Studio для MySQL, має багату функціональність та стабільність.


Складно знайти, на яких платформах працює цей інструмент налагодження. Здається, працює у Windows. Щось іще?
Хлопець

10

Налагоджувач для 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;

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

Тут згадувались

Як зловити будь-який виняток у тригерах та зберігати процедури для mysql?


7

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


7

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

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 перед новою налагодженням $

Це альтернатива методам "вставки" та "журналу". Ваш код залишається без додаткових інструкцій "налагодження".

Знімок екрана:

кінцева точка кінцевої точки окулоту


6

MySQL Connector / Net 6.6 має функцію налагодження збережених процедур та функцій

Встановлення налагоджувача

Щоб увімкнути налагоджувач збереженої процедури:

  • Для Connector / Net 6.6: Встановіть Connector / Net 6.6 та оберіть опцію Complete.
  • Для Connector / Net 6.7 та новіших версій: Встановіть продукт MySQL для Visual Studio, до якого належить відладчик збереженої процедури.

Запуск налагоджувача

Щоб запустити налагоджувач, виконайте наступні дії:

  • Виберіть з'єднання в провіднику Visual Studio Server.
  • Розгорніть папку Збережені процедури. Лише збережені процедури можуть бути налагоджені безпосередньо. Для налагодження визначеної користувачем функції створіть збережену
    процедуру, яка викликає функцію.
  • Клацніть на збереженому вузлі процедури, потім клацніть правою кнопкою миші та у контекстному меню виберіть «Налагодити звичайний режим».

5

MySql Connector / NET також включає відладчик збережених процедур, інтегрований у візуальну студію, починаючи з версії 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.


Під час використання MySQL та Connector .NET виникає проблема з рядком підключення до кількох хостів. Я пояснив це питання тут . Мені було цікаво, чи хтось збирається розібратися в цьому? Це спричинило досить багато проблем для багатьох з нас. NET розробників, які використовують MySQL ...
Hooman Bahreini

1
Вибачте, що я більше не працюю в Oracle і не маю багато вільного часу, пропоную зв’язатися з підтримкою MySQL.
Фернандо Гонсалес Санчес

4

Перший і стабільний налагоджувач для MySQL знаходиться в dbForge Studio для MySQL


3

Я мав використовувати два різні інструменти для налагодження процедур та функцій:

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

3

Визначена користувачем змінна 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

1

Жаба mysql. Існує безкоштовна версія http://www.quest.com/toad-for-mysql/


1
Я використовував Toad роками, але не знав, що він має якісь особливості для налагодження паростків. Чи можете ви пояснити, як ви використовуєте Toad для цього?
Cory House

Щойно подивився Toad 6.3 для mysql, схоже, є функція налагодження з точками переривання і всім іншим. Ви маєте на увазі, що функція налагодження не працює? А може, ваша версія є старшою і не містить функції налагодження?
Джойс

1

Відповідь на це відповів @Brad Parks Не впевнений у версії MySQL, але мій був 5,6, отже, трохи налаштування працює:

Я створив функцію, debug_msgяка є функцією (не процедура) і повертає текст (без обмеження символів), а потім викликаю функцію як SELECT debug_msg(парами) 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.