Sto provando a registrare tutti gli errori nel mio database in una tabella. Così come utente SYS ho scritto il seguente codice:Come sviluppare un trigger after serverror in Oracle?
CREATE TABLE servererror_log (
error_datetime TIMESTAMP,
error_user VARCHAR2(30),
db_name VARCHAR2(9),
error_stack VARCHAR2(2000),
captured_sql VARCHAR2(1000));
/
CREATE OR REPLACE TRIGGER log_server_errors
AFTER SERVERERROR
ON DATABASE
DECLARE
captured_sql VARCHAR2(1000);
BEGIN
SELECT q.sql_text
INTO captured_sql
FROM gv$sql q, gv$sql_cursor c, gv$session s
WHERE s.audsid = audsid
AND s.prev_sql_addr = q.address
AND q.address = c.parent_handle;
INSERT INTO servererror_log
(error_datetime, error_user, db_name,
error_stack, captured_sql)
VALUES
(systimestamp, sys.login_user, sys.database_name,
dbms_utility.format_error_stack, captured_sql);
END log_server_errors;
Ma quando forzo un errore come cercando di selezionare da una tabella inesistente che accedo Indifferente l'errore nella tabella.
C'è un modo per controllare che il trigger si attiva? Inoltre, ho provato a creare una tabella di test da inserire lì ma non funziona neanche, anche se definisci il trigger come una transazione autonoma e commetti all'interno del trigger.
Grazie, Joaquin
non funziona. Inoltre ho provato questo stesso approccio prima senza risultati. Sembra che l'innesco non stia sparando. Altre idee? Sai come posso verificare se è stato attivato un trigger? Qualcosa come una vista con una colonna LAST_FIRED_TIME o qualcosa del genere. Grazie Joaquin – xocasdashdash
Potrebbe essere l'inserto. Il problema è che se il trigger fallisce, è difficile da catturare. Avrei usato UTL_FILE o una procedura separata con una transazione autonoma. Vedi http://stackoverflow.com/questions/492705/is-there-any-way-to-log-all-failed-sql-statements-in-oracle-10g –