我創建了一個包含所有可信來源的主機名的表。如果連接的主機不在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查詢'。
我需要在utl_file輸出中包含由會話執行的'sql查詢' – anudeepks 2014-09-20 06:26:31
您試圖解決什麼問題?我的猜測是,你真的想要使用審計而不是寫觸發器。 AWR將不會執行會話的所有聲明。充其量,v $ active_session_history將會有任何SQL語句碰巧在一秒之內處於活動狀態,但尚未從緩衝區中清除。這不可能是會話執行的每個SQL語句,特別是對於長時間運行的會話。 – 2014-09-20 06:56:50
在註銷之前記錄會話執行的sql查詢。使用審計將是一個昂貴的過程。 – anudeepks 2014-09-20 07:03:27