如果我从 admin1 访问表 emp,则使用下面的函数,理想情况下它应该返回 0,这表示连接用户为“ADMIN”,但它返回 1(最终用户的连接使用 ADMINT_TEST1.emp)
即使选择audit_test1.emp(函数 check_user 在两种模式中都可用),我也希望获得 ADMIN1 用户的连接标识,例如:来自 admin1 用户
create or replace function check_user
return number
is
n number;
begin
SELECT sys_context('USERENV', 'CURRENT_USER') into usrname FROM dual;
if (usrname ='AUDIT_TEST') then
dbms_output.put_line('show user'||usrname);
return 1;
else
return 0;
end if;
end ;
Run Code Online (Sandbox Code Playgroud)
测试功能(从用户运行:ADMIN1)
declare
n number(1);
begin
select audit_test.check_user into n from dual;
dbms_output.put_line(n);
select check_user into n from dual;
dbms_output.put_line(n);
end;
/
Output
===============
show user AUDIT_TEST
1
show user ADMIN1
0
Run Code Online (Sandbox Code Playgroud)
这是预期的功能吗?即使发起用户是 ADMIN1,当我们发出 …
我创建了一个包含所有可信源的主机名的表.如果连接的主机不在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 …Run Code Online (Sandbox Code Playgroud)