2014-09-20 63 views
-1

我創建了一個包含所有可信來源的主機名的表。如果連接的主機不在snif_session表中,我寫了一個oracle註銷觸發器來獲取由該會話執行的所有sql的詳細信息。我正在將輸出傳送到包含sid,主機名,連接時間的utl_file輸出。Oracle註銷觸發器以獲取按會話執行的sql

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; 

我需要在utl_file輸出中包含由會話執行的'sql查詢'。

+0

我需要在utl_file輸出中包含由會話執行的'sql查詢' – anudeepks 2014-09-20 06:26:31

+1

您試圖解決什麼問題?我的猜測是,你真的想要使用審計而不是寫觸發器。 AWR將不會執行會話的所有聲明。充其量,v $ active_session_history將會有任何SQL語句碰巧在一秒之內處於活動狀態,但尚未從緩衝區中清除。這不可能是會話執行的每個SQL語句,特別是對於長時間運行的會話。 – 2014-09-20 06:56:50

+0

在註銷之前記錄會話執行的sql查詢。使用審計將是一個昂貴的過程。 – anudeepks 2014-09-20 07:03:27

回答

5

「我需要包括‘SQL查詢’也是由會話中執行」

無論你的建議的查詢會給你一個會話中執行的所有SQL。

V $ SESSION是一個動態視圖,所以它只是顯示會話現在發生了什麼

DBA_HIST_ACTIVE_SESS_HISTORY是a series of snapshots of running SQL。它旨在用於性能分析,因此它基本上是一個隨機的活動語句子集。此外,它也是診斷和優化包的一部分:如果您使用該許可證,則您將違反您的許可證,而無需支付額外費用。

看來你真正需要的是審計線索。爲什麼不研究Oracle已經具備的功能,而不是自己動手?有AUDIT來跟蹤DDL活動。有細粒度的審計來監視較低級別的DML。 Find out more