Drukuj informacje debugowania z procedury składowanej w MySQL


Odpowiedzi:


117

Opcja 1: Umieść to w swojej procedurze, aby wydrukować „komentarz” na stdout po uruchomieniu.

SELECT 'Comment';

Opcja 2: Umieść to w swojej procedurze, aby wydrukować zmienną z nią na stdout:

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

Drukuje myvar is 5na standardowe wyjście, gdy procedura jest uruchomiona.

Opcja 3. Utwórz tabelę z jedną kolumną tekstową o nazwie tmptablei wysyłaj do niej wiadomości:

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

Możesz umieścić powyższe w procedurze składowanej, więc wszystko, co musiałbyś napisać, to:

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

Co oszczędza kilka naciśnięć klawiszy.

Opcja 4, rejestruj komunikaty do pliku

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

To polecenie ma bardzo duże ograniczenia. Możesz zapisać plik wyjściowy tylko w obszarach na dysku, które dają grupie „inne” uprawnienia do tworzenia i zapisu. Powinien działać, zapisując go w katalogu / tmp.

Również po napisaniu pliku wyjściowego nie można go zastąpić. Ma to na celu zapobieżenie zrootowaniu twojego komputera przez crackerów tylko dlatego, że wstrzyknął SQL do twojej witryny i może uruchamiać dowolne polecenia w MySQL.


3
mysql narzeka Not allowed to return a result set from a trigger, jakiś pomysł?
Jerry Chin

Prawdopodobnie rozwiązałeś problem w prawie 3 lata, ale użyj danych wyjściowych do pliku, aby pozbyć się błędu.
Gabriel Cliseru



5

Zwykle tworzę tabelę dziennika z procedurą składowaną, aby się do niej zalogować. Wywołaj procedurę logowania w razie potrzeby z opracowywanej procedury.

Patrząc na inne posty na to samo pytanie, wydaje się, że jest to powszechna praktyka, chociaż istnieje kilka alternatyw.


5
Tablica dziennika powinna być MyISAM lub innym nietransakcyjnym silnikiem pamięci masowej, aby można było śledzić nawet
wycofane

4

Oto sposób, w jaki będę debugować:

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 

Jeśli zapytanie 1, 2 lub 3 zwróci błąd, HANDLER przechwyci SQLEXCEPTION, a SHOW ERRORS pokaże nam błędy. Uwaga: SHOW ERRORS powinno być pierwszą instrukcją w HANDLER.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.