您好,如果问题已经被问到,请提前道歉。我还没能找到答案。
我想知道是否有一个表保存了oracle用户名的记录,这些用户名执行了一个特定的过程或函数。
我正在尝试创建一个可以被另一个过程作为子程序调用的过程。我要创建的过程将在每次执行其他过程时创建一个日志条目。在下面的例子;
User_Name =执行函数的Oracle用户名。
Name =过程或函数的名称。
LastCompileDT =函数或过程最后编译的日期/时间。
我有点卡在哪里来源的数据。我遇到过all_source表,但它只给了我过程的所有者,而不是执行用户。
如有任何反馈,将不胜感激。
谢谢
可能有几种方法可以做到这一点。也许其他人可以提出一种从一个数据字典视图中提取所有这些数据的方法。但是,我的方法是这样的:
-
User_Name:使用关键字USER。它返回执行该过程的Oracle用户:
SELECT USER FROM DUAL;
但是,如果您对执行该过程的操作系统用户感兴趣,那么您可以使用以下
SELECT sys_context( 'userenv', 'os_user' ) FROM DUAL;
更多信息请点击这里。据我所知,这只能动态获取,默认情况下不会记录在任何地方。所以你需要在调用过程时运行它。
-
程序名称:&
-
LastCompileDT:可以从视图
中获取USER_OBJECTS
SELECT OBJECT_NAME, LAST_DDL_TIME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE' AND OBJECT_NAME = '<YOUR PROCEDURE NAME>';
您可以使用提供的内置审计表,而不是滚动您自己的审计。
见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/Name。
对于最后一次编译时间,请查看Hawk的答案,或者如果您想查看最后DDL时间的历史记录,您可以将其添加到审计
--Turn on auditing of creating procs
AUDIT CREATE PROCEDURE BY ACCESS;