我创建了一个包含所有可信源的主机名的表。如果连接的主机不在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输出中的会话执行。
答案 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