2014-09-25 33 views
0

所以我知道通过审计连接和触发器选项进行跟踪。但是我们可以执行一个程序。如何跟踪Oracle用户使用过程登录到数据库?

我在v $ session(我认为它是一个视图而不是表格)时出现错误...任何解决方法?谢谢! 代码:

create or replace procedure logon_audit_proc 
is 
    v_user varchar2(100); 
    v_machine varchar2(100); 
    v_sid number; 
    v_serial number; 

    cursor c1 is 
    SELECT osuser, machine, sid,serial# FROM **v$session**; 

BEGIN 
    open c1; 
    loop 
    fetch c1 into v_user,v_machine,v_sid,v_serial; 
    exit when c1%notfound; 
    dbms_output.put_line('****'); 
    dbms_output.put_line('The emp name is '||v_user); 
    dbms_output.put_line('The emp name is '||v_machine); 
    dbms_output.put_line('The emp name is '||v_sid); 
    dbms_output.put_line('The emp name is '||v_serial); 
    dbms_output.put_line('****'); 
    end loop; 
    close c1; 
END; 
+0

欢迎计算器。这很像这里的问题,http://stackoverflow.com/questions/15541990/sqlplus-how-to-find-details-of-the-currently-connected-database-session。 – 2014-09-25 18:10:11

+1

请描述为什么内置审计功能不能满足您的要求。 – thatjeffsmith 2014-09-26 02:08:42

+0

@hillbillyToad,这些选项在审查,但我们正在尝试的东西,需要,如果这可以作为一个过程。同时proc的问题是,已经登录和关闭proc之前运行的用户不会被捕获。但感谢您提出 – ak548 2014-09-26 14:43:01

回答

1

会话可能没有对象,在定义者权限程序使用它的时候是必要的直接补助。第一运行此准予作为SYS,然后重新编译:grant select on sys.v_$session to <test schema>;

此外,光标开取闭方法比隐式游标慢,更复杂:

begin 
    for sessions in (SELECT osuser, machine, sid,serial# FROM v$session) loop 
    dbms_output.put_line(sessions.osuser); 
    --... 
    end loop; 
end; 
/
+0

谢谢!但我认为结果返回多行,所以使用显式游标,嗯授予选择..仍然不适合我。 – ak548 2014-09-26 14:50:55

+0

你会得到什么错误?另外,当返回多行时,隐式游标仍然是首选,因为Oracle会自动批量收集数据。 – 2014-09-26 15:30:59

+0

以及你可以告诉我有点noob仍然学习绳索​​..所以我试图在我的电脑(甲骨文,我已经安装)上运行这个,所以它的是斯科特(对吧?)。错误是SQL错误:ORA-01031:特权不足..因为它是我自己的系统(不应该我是系统管理员,因此有权限)..感谢您抽出时间帮助... – ak548 2014-09-26 16:17:38