有没有办法将oracle 10g中所有失败的sql语句记录到表或文件中?
失败的意思是糟糕的格式化sql语句或没有表或对象权限的sql语句.
小智 11
您可能希望使用审计,如:
审计选择表,插入表,删除表,通过访问执行的程序,而不是成功的;
ACCESS用于每个语句(看起来像你想要的).通过SESSION将记录每个会话一个记录(高容量环境).
Oracle的内置审计比触发器具有更少的开销.其他答案包含的触发器允许您记录所需的确切信息.审计也只会捕获现有对象的命中.如果有人选择不存在的表(拼写错误或诸如此类),审计将无法捕获它.上面的触发器会.
安全指南中提供了更多信息:http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/auditing.htm#i1011984
您可以使用系统触发器来执行此操作。
我直接从http://www.psoug.org/reference/system_trigger.html复制了这段代码。
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;
/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12007 次 |
| 最近记录: |