Я пытаюсь зарегистрировать все ошибки в моей базе данных в таблице. Так как пользовательский SYS я написал следующий код:Как создать триггер afterror в 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;
Но когда я заставить ошибку как пытаться выбрать из несуществующей таблицы он это не распространяется зарегистрировать ошибку в таблице.
Есть ли способ проверить, что срабатывает триггер? Кроме того, я попытался создать тестовую таблицу для ее вставки, но она тоже не работает, даже если определить триггер как автономную транзакцию и зафиксировать внутри триггера.
Спасибо, Joaquin
не работает. Также я пробовал этот же подход раньше, без каких-либо результатов. Кажется, что триггер не стреляет. Любые другие идеи? Вы знаете, как я могу проверить, был ли запущен триггер? Что-то вроде представления с столбцом LAST_FIRED_TIME или что-то в этом роде. Thanks Joaquin – xocasdashdash
Может быть вставка. Проблема в том, что если триггер не работает, его трудно поймать. Я бы использовал UTL_FILE или отдельную процедуру с автономной транзакцией. См. http://stackoverflow.com/questions/492705/is-there-any-way-to-log-all-failed-sql-statements-in-oracle-10g –