2014-09-25 44 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