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

anu*_*pks -1 security oracle audit triggers plsql

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

SQL> select * from snif_Session;

ALLOWED_HOST
--------------------------------------------------
RND1
WORKGROUP\RND1
Run Code Online (Sandbox Code Playgroud)

我被卡住的地方是用于获取该特定会话执行的所有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 
Run Code Online (Sandbox Code Playgroud)

要么

select s.sid
         , s.serial#
         , a.sql_text
from v$session s
    join v$sqlarea a 
            on a.hash_value = s.sql_hash_value ;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

我需要在utl_file输出中包含也由session执行的'sql查询'.

APC*_*APC 5

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

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

V $ SESSION是一个动态的观点,所以它只是显示了在一个会议上发生的事情,现在.

DBA_HIST_ACTIVE_SESS_HISTORY是运行SQL的一系列快照.它用于性能分析,因此它基本上是一个随机的活动语句子集.此外,它是诊断和调整包的一部分:如果您使用它而不支付额外费用,您将违反许可证.

看来你真正需要的是审计线索.为什么不调查Oracle已有的功能,而不是自己动手?有跟踪DDL活动的AUDIT.有细粒度的审计来监控低级别的DML. 了解更多.