[20121214]数据库错误记录.txt
--自己参照许多文档,写了一个检测数据库错误的例子:
--以sys用户登录,建立表
CREATE TABLE SYS.ERROR_LOG
(
IP_ADDRESS VARCHAR2(30 BYTE),
USERNAME VARCHAR2(30 BYTE),
INSTANCE_NUMBER NUMBER(2),
THEDATE DATE,
ERRORMSG VARCHAR2(4000 BYTE),
OTHERMSG VARCHAR2(4000 BYTE),
SQLSTMT VARCHAR2(4000 BYTE)
) TABLESPACE TOOLS; ;
--最好放在单独建立一个表空间,不要与system表空间在一起。
/* Formatted on 2012/12/14 09:27 (Formatter Plus v4.8.8) */
--
-- LOG_ERRORS (Trigger)
--
-- Dependencies:
-- STANDARD (Package)
-- DBMS_STANDARD (Package)
-- INSTANCE_NUM (Function)
-- ORA_INSTANCE_NUM (Synonym)
-- LOGIN_USER (Function)
-- ORA_LOGIN_USER (Synonym)
-- ORA_SQL_TXT (Synonym)
-- ORA_SERVER_ERROR_MSG (Synonym)
-- ORA_SERVER_ERROR_DEPTH (Synonym)
-- ORA_SERVER_ERROR_DEPTH ()
-- ERROR_LOG (Table)
-- ORA_SERVER_ERROR_MSG ()
-- ORA_SQL_TXT ()
-- ORA_INSTANCE_NUM ()
-- ORA_LOGIN_USER ()
-- V$SESSION (View)
-- V$MYSTAT (View)
--
CREATE OR REPLACE TRIGGER SYS.log_errors
AFTER SERVERERROR ON DATABASE
DECLARE
sqltext ora_name_list_t;
errmsg VARCHAR2 (4000) := NULL;
errstmt VARCHAR2 (4000) := NULL;
errothermsg VARCHAR2 (4000) := NULL;
BEGIN
IF ( -- NOT is_servererror (904)
-- AND NOT is_servererror (942)
-- AND NOT is_servererror (937)
-- AND NOT is_servererror (1002)
-- AND NOT is_servererror (1003)
-- AND
NOT is_servererror (942) AND NOT is_servererror (1407)
-- AND NOT is_servererror (1430)
-- AND NOT is_servererror (54)
-- AND NOT is_servererror (6550)
-- AND NOT is_servererror (936)
)
THEN
FOR DEPTH IN 1 .. ora_server_error_depth
LOOP
errmsg := errmsg || ora_server_error_msg (DEPTH);
END LOOP;
FOR cntr IN 1 .. ora_sql_txt (sqltext)
LOOP
errstmt := errstmt || sqltext (cntr);
END LOOP;
SELECT 'sid:' || SID || ' SERIAL#: ' || serial# || ' terminal:' || terminal || ' program:' || program || ' module:'
|| module
INTO errothermsg
FROM v$session
WHERE SID = (SELECT SID
FROM v$mystat
WHERE ROWNUM = 1);
INSERT INTO error_log
(ip_address, username, instance_number, thedate, errormsg, othermsg,
sqlstmt
)
VALUES (SYS_CONTEXT ('USERENV', 'IP_ADDRESS'), ora_login_user, ora_instance_num, SYSDATE, errmsg, errothermsg,
errstmt
);
END IF;
END;
/
--ALTER TRIGGER SYS.LOG_ERRORS DISABLE;
--如果一些错误不想监测,加入NOT is_servererror (XXX),XXX表示错误号。
--也可以disable,在需要的时候打开。