Tôi đang cố gắng ghi lại tất cả các lỗi trong cơ sở dữ liệu của tôi vào một bảng. Vì vậy, khi người dùng sys tôi đã viết mã sau đây:Làm thế nào để phát triển một kích hoạt sau khi serverror trong 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;
Nhưng khi tôi buộc lỗi như cố gắng chọn từ một bảng không tồn tại, nó không ghi lại lỗi trong bảng.
Có cách nào để kiểm tra xem kích hoạt có kích hoạt không? Ngoài ra, tôi đã thử tạo một bảng thử nghiệm để chèn vào đó, nhưng nó cũng không hoạt động, ngay cả khi xác định trình kích hoạt là một giao dịch tự quản và cam kết bên trong trình kích hoạt.
Cảm ơn, Joaquin
nó không hoạt động. Ngoài ra tôi đã thử phương pháp này trước đây mà không có kết quả. Có vẻ như cò súng không bắn. Bất kỳ ý tưởng nào khác? Bạn có biết làm thế nào tôi có thể kiểm tra nếu một kích hoạt đã bị sa thải? Một cái gì đó giống như một cái nhìn với một cột LAST_FIRED_TIME hoặc một cái gì đó như thế. Cảm ơn Joaquin – xocasdashdash
Có thể là chèn. Vấn đề là, nếu kích hoạt thất bại, nó khó nắm bắt. Tôi sẽ sử dụng UTL_FILE hoặc một thủ tục riêng biệt với giao dịch tự quản. Xem http://stackoverflow.com/questions/492705/is-there-any-way-to-log-all-failed-sql-statements-in-oracle-10g –