データベース内のすべてのエラーをテーブルに記録しようとしています。したがって、ユーザー sys として、次のコードを書きました。
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;
しかし、存在しないテーブルから選択しようとするようなエラーを強制すると、テーブルにエラーが記録されません。
トリガーがまったく起動していることを確認する方法はありますか? また、そこに挿入するテストテーブルを作成しようとしましたが、トリガーを自律型トランザクションとして定義し、トリガー内でコミットしても機能しません。
ありがとう、ホアキン