Estoy tratando de registrar todos los errores en mi base de datos en una tabla. Así como usuario sys i escribió el siguiente código:¿Cómo desarrollar un desencadenador after serverror en 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;
Pero cuando fuerzo un error como tratar de seleccionar de una tabla no existente que Indiferente registrar el error en la tabla.
¿Hay alguna manera de verificar que el gatillo se dispare en absoluto? Además, intenté crear una tabla de prueba para insertar allí, pero tampoco funciona, incluso si defino el activador como una transacción autónoma y me comprometo dentro del desencadenador.
Gracias, Joaquín
no funciona. También he intentado este mismo enfoque antes sin resultados. Parece que el gatillo no está disparando. ¿Alguna otra idea? ¿Sabes cómo puedo verificar si se disparó un disparador? Algo así como una vista con una columna LAST_FIRED_TIME o algo así. Gracias Joaquin – xocasdashdash
Podría ser el inserto. El problema es que si falla el gatillo, es difícil de atrapar. Yo usaría UTL_FILE o un procedimiento separado con transacción autónoma. Ver http://stackoverflow.com/questions/492705/is-there-any-way-to-log-all-failed-sql-statements-in-oracle-10g –