有没有办法在oracle 10g中记录所有失败的sql语句

5 sql oracle

有没有办法将oracle 10g中所有失败的sql语句记录到表或文件中?

失败的意思是糟糕的格式化sql语句或没有表或对象权限的sql语句.

小智 11

您可能希望使用审计,如:

审计选择表,插入表,删除表,通过访问执行的程序,而不是成功的;

ACCESS用于每个语句(看起来像你想要的).通过SESSION将记录每个会话一个记录(高容量环境).

Oracle的内置审计比触发器具有更少的开销.其他答案包含的触发器允许您记录所需的确切信息.审计也只会捕获现有对象的命中.如果有人选择不存在的表(拼写错误或诸如此类),审计将无法捕获它.上面的触发器会.

安全指南中提供了更多信息:http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/auditing.htm#i1011984


Dan*_*mge 1

您可以使用系统触发器来执行此操作。

我直接从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)