2016-09-25 38 views
0

如果已經問過問題,請提前致歉並致歉。我一直沒有遇到答案。PL SQL - 過程 - 表,其中包含執行過程的用戶的記錄

我想知道是否有一張表,其中包含執行特定過程或函數的oracle用戶名記錄。

我想創建一個過程,可以通過另一個過程作爲子程序調用。我正在創建的過程將在每次執行其他過程時創建一個日誌條目。下面的例子;

User_Name =執行該功能的人員的Oracle用戶名。

Name =過程或函數的名稱。

LastCompileDT =函數或過程上次編譯的日期/時間。

我有點卡在哪裏來源數據。 我遇到過all_source表,但它只給我這個過程的所有者,而不是執行用戶。

任何反饋將不勝感激。

謝謝

+1

偉大的答案已經給出。然而,有一點需要記住的是正常的存儲過程將與調用存儲過程一起回滾,這通常不是您想要的用於審計目的的存儲過程。你可能想讓你的審計存儲過程自治 –

回答

1

可能有幾種方法可以做到這一點。也許別人可以提出一種從一個數據字典視圖中提取所有這些數據的方法。但是,我的方法是這樣的:

  1. User_Name:使用關鍵字USER。它返回執行過程Oracle用戶:

    SELECT USER FROM DUAL; 
    

    但是,如果你有興趣在誰執行的程序的操作系統的用戶,那麼你可以使用下面的

    SELECT sys_context('userenv', 'os_user') FROM DUAL; 
    

    更多關於此here。據我所知,這隻能在飛行中獲取,並且默認情況下它不會被記錄到任何地方。所以你需要在你調用程序時運行它。

  2. 程序名稱:&

  3. LastCompileDT:可以從視圖USER_OBJECTS

    SELECT OBJECT_NAME, LAST_DDL_TIME 
    FROM USER_OBJECTS 
    WHERE OBJECT_TYPE = 'PROCEDURE' 
    AND OBJECT_NAME = '<YOUR PROCEDURE NAME>'; 
    
+0

謝謝霍克,這正是我所期待的。 – saggart

1

而不是滾動您自己的審計中獲取,你可以使用所提供的內置審計表。

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4007.htm

--Create a test procedure as an example 
CREATE PROCEDURE my_test_proc 
AS 
BEGIN 
    NULL; 
END my_test_proc; 

--Turning on auditing executions of the proc 
AUDIT EXECUTE ON my_test_proc BY ACCESS WHENEVER SUCCESSFUL; 

--Run the proc 
EXEC my_test_proc; 

--check audit history 
SELECT * 
    FROM dba_common_audit_trail cat 
WHERE cat.object_name = 'MY_TEST_PROC'; 

的DBA_COMMON_AUDIT_TRAIL表中的列DB_USER和OBJECT_NAME爲您的User_Name /名稱。

在過去的編譯時間看鷹的答案,或者如果你想看到的最後一個DDL次歷史,你可以添加此審計

--Turn on auditing of creating procs 
AUDIT CREATE PROCEDURE BY ACCESS;