Роздрукуйте інформацію про налагодження із збереженої процедури в MySQL


83

Чи існує спосіб у MySQL надрукувати повідомлення про налагодження у stdout, спокусливі чи журнальні файли? Щось на зразок:

  • print в SQLServer
  • DBMS_OUTPUT.PUT_LINE в Oracle

увійти з будь-якого місця з допомогою incron stackoverflow.com/a/41766032/953374
bortunac

Відповіді:


113

Варіант 1: Помістіть це у своїй процедурі, щоб надрукувати "коментар" до stdout під час запуску.

SELECT 'Comment';

Варіант 2: Помістіть це у своїй процедурі, щоб надрукувати змінну з ним до stdout:

declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);

Це друкується myvar is 5на stdout під час запуску процедури.

Варіант 3: Створіть таблицю з одним текстовим стовпцем, який називається tmptable, і вставте до неї повідомлення:

declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);

Ви можете помістити вищезгадане у збережену процедуру, тож усе, що вам потрібно буде написати, це:

CALL log(concat('the value is', myvar));

Що економить кілька натискань клавіш.

Варіант 4, Журнал повідомлень у файл

select "penguin" as log into outfile '/tmp/result.txt';

Для цієї команди існують дуже важкі обмеження. Ви можете записати вихідний файл лише в області на диску, які надають групі "інші" дозволи на створення та запис. Він повинен працювати, зберігаючи його в каталозі / tmp.

Крім того, коли ви пишете вихідний файл, ви не можете його перезаписати. Це робиться для того, щоб зловмисники не вкорінювали ваш ящик лише тому, що вони ввели ваш сайт і можуть запускати довільні команди в MySQL.


3
mysql скаржиться Not allowed to return a result set from a trigger, будь-яка ідея?
Джеррі Чін,

Можливо, ви вирішили проблему майже за 3 роки, але використовуйте результати для подання файлу, щоб позбутися помилки.
Габріель Клісеру,


5

Зазвичай я створюю таблицю журналів із збереженою процедурою для входу в неї. Викликати процедуру ведення журналу де завгодно із процедури, що розробляється.

Дивлячись на інші публікації з цього самого питання, це здається звичайною практикою, хоча є й деякі альтернативи.




3

Це спосіб, яким я буду налагоджувати:

CREATE PROCEDURE procedure_name() 
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SHOW ERRORS;  --this is the only one which you need
        ROLLBACK;   
    END; 
    START TRANSACTION;
        --query 1
        --query 2
        --query 3
    COMMIT;
END 

Якщо запит 1, 2 або 3 видасть помилку, HANDLER вловить SQLEXCEPTION, а SHOW ERRORS покаже нам помилки. Примітка: SHOW ERRORS має бути першим твердженням у HANDLER.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.