ciao!
ho delle stored procedure che vengono lanciate di notte.
volevo sapere se esiste un modo per farne il log, in modo che la mattina posso vedere se ci sono stati errori.
ciao!
ho delle stored procedure che vengono lanciate di notte.
volevo sapere se esiste un modo per farne il log, in modo che la mattina posso vedere se ci sono stati errori.
nessuno ha un qualche suggerimento??
Puoi loggarti gli errori da solo in una tabella, usando le istruzioni DECLARE HANDLER e GET DIAGNOSTICS.
DECLARE ... HANDLER FOR SQLWARNINGS, NOT FOUND, SQLEXCEPTIONS intercetta tutti gli errori che non sono già gestiti da un altro handler. GET DIAGNOSTICS serve a mettere le proprietà di quegli errori (sqlstate, codice, messaggio) in delle variabili.
Puoi anche cercare su google la stored procedure materialize_diagnostics_area(), che copia il contenuto della diagnostics area (cioè gli errori) in una tabella. Dovrai però modificarla un po', perché, così com'è, ogni volta che la chiami cancella i contenuti già presenti (come fa la diagnostics area "vera"). Ma è una modifica banale.
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
ciao!
intanto grazie per la risposta.
sto provando così, ma gli va mai bene l'istruzione o sintassi:
l'errore è proprio in quel blocco di codice perchè senza di quello non ottengo errori in fase di creazione della SP.codice:BEGIN DECLARE CONTINUE HANDLER FOR SQLWARNINGS, NOT FOUND, SQLEXCEPTIONS INSERT INTO errori VALUES(NULL,'cr_clienti','prova','errore di prova',NOW()); ................................... END
qualche idea??
ok così:
codice:DECLARE CONTINUE HANDLER FOR SQLWARNING, SQLEXCEPTION, NOT FOUND INSERT INTO errori VALUES(NULL,'cr_clienti','prova','errore di prova',NOW());
Guarda, questo va bene per loggare che c'è stato un errore e a che ora. Però non sai che errore c'è stato.
Ora, se tu usi MySQL 5.6 (o in teoria anche MariaDB 10, però è in beta) hai il comando GET DIAGNOSTICS, che ti permette di sapere che errore c'è stato.
Ti faccio un esempio alla buona, scusa ma non lo testo quindi magari ci sono degli errori:
DECLARE CONTINUE HANDLER ...
GET DIAGNOSTICS @n = NUMBER;
In @n troverai il numero degli errori che sono presenti nella diagnostics area (l'oggetto che contiene gli ultimi errori). Non è detto che sia uno solo, perché magari hai lanciato una INSERT che ha generato 3 errori, e allora li hai tutti e tre.
Per vedere il primo errore:
GET DIAGNOSTICS CONDITION 1 @errno = MYSQL_ERRNO, @sqlstate = SQLSTATE, @text = MESSAGE_TEXT;
A questo punto hai messo il codice di errore, l'sqlstate e il messaggio di errore dentro 3 variabili, che puoi visualizzare comodamente con una select. Il tuo problema è che NON puoi loggarlo, perché nel momento in cui fai una insert, la diagnostics area si svuota... quindi, se c'erano anche altri errori, spariscono.
E' per questo che ti consigliavo di cercare in rete la stored procedure materialize_diagnostics_area().
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
ok grazie per la spigeazione.
in pratica mi stai dicendo che con il tuo esempio non posso scrivere un record per ogni errore, giusto?
se così fosse, non posso poi iterare sulla SELECT, e per ogni record metterlo nella tabella errori?
nel frattemtpo, cmq, mi guardo materialize_diagnostics_area().
Sì puoi iterare e fare una select a ogni iterazione... il problema è che con la select li visualizzi, ma poi come fai a loggarli? Appena fai una INSERT per loggare un errore, tutti gli altri se ne vanno.
La soluzione ci sarebbe, ma richiede un sacco di codice SQL... è per questo che ti consiglio di usare quella procedura![]()
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
altra domanda, in alternativa.
ho visto che senza tutte quelle istruzioni (DECLARE HANDLER....) la SP produce cmq l'output di errore.
non sarebbe possibile in maniera più easy prendere quell'output??
Puoi provare a farti un cron job che avvia un comando tipo:
mysqld < job.sql > errors.txt
e job.sql contiene il comando SQL per lanciare la tua stored procedure
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit