Oracle logoff触发器来获取会话执行的sql

时间:2014-09-20 06:25:24

标签: oracle security plsql triggers audit

我创建了一个包含所有可信源的主机名的表。如果连接的主机不在snif_session表中,我已经编写了一个oracle注销触发器来获取该会话执行的所有sql的详细信息。我将输出带到utl_file输出,其中包含sid,主机名,连接时间。

SQL> select * from snif_Session;

ALLOWED_HOST
--------------------------------------------------
RND1
WORKGROUP\RND1

我遇到的问题是使用什么查询来获取该特定会话执行的所有sql(我可以从v $ mystat获取sid)。

这样做效果最好:

select a.sql_id
         ,b.sql_text 
from dba_hist_active_sess_history a
        ,dba_hist_sqltext b
where a.sql_id=b.sql_id 

select s.sid
         , s.serial#
         , a.sql_text
from v$session s
    join v$sqlarea a 
            on a.hash_value = s.sql_hash_value ;

这是我写的代码(块),我将把它放在触发器中。

declare
    machine_id varchar2(50);
    val int;
    auth_terminal varchar2(50);
    check_machine varchar2(1000);
    mydate char(50);
    osuser_1 varchar2(50);
    sid_1 int;
    sql_query_1 varchar2(5000);
    machine_1 varchar2(50);
    trace_info UTL_FILE.FILE_TYPE;
begin
    select machine into check_machine 
    from v$session 
    where sid in (select distinct(sid) from v$mystat) ;
    select count(*) into val 
    from snif_session 
    where allowed_host=check_machine;
    if ( 1=val) then
        dbms_output.put_line(check_machine|| ' dont check host' );
    else
        dbms_output.put_line(check_machine || ' check host' );
    end if;
    select osuser,sid,machine 
    into osuser_1,sid_1,machine_1 
    from v$session 
    where sid in (select distinct(sid) from v$mystat);
    SELECT TO_char(systimestamp,'mm/dd/yyyy HH24:MI:SS') into mydate   
    FROM DUAL;
    dbms_output.put_line(mydate || sid_1 || '   ' || osuser_1 || '  '|| machine_1);
    trace_info := UTL_FILE.FOPEN('UTL_DIR', 'trace_info_file.txt', 'W');
    UTL_FILE.PUTF(trace_info,mydate||'  '||sid_1||'     '||osuser_1||'  '|| machine_1);
    UTL_FILE.FCLOSE(trace_info);
EXCEPTION
    WHEN utl_file.invalid_path THEN
       raise_application_error(-20000, 'ERROR: Invalid PATH FOR file.');
end;

我需要包含' sql查询'也由utl_file输出中的会话执行。

1 个答案:

答案 0 :(得分:5)

  

“我需要包含'sql查询'也由会话执行”

您的任何建议查询都不会为您提供会话执行的所有SQL。

V $ SESSION是一个动态视图,因此它只是显示会话中正在发生的事情

DBA_HIST_ACTIVE_SESS_HISTORY是a series of snapshots of running SQL。它用于性能分析,因此它基本上是一个随机的活动语句子集。此外,它是诊断和调整包的一部分:如果您使用它而不需要支付额外费用,您将违反许可证。

您真正需要的是审计线索。为什么不调查Oracle已有的功能,而不是自己动手?有跟踪DDL活动的AUDIT。有细粒度的审计来监控低级别的DML。 Find out more