PL SQL - 过程 - 保存执行过程的用户记录的表

Posted

技术标签:

【中文标题】PL SQL - 过程 - 保存执行过程的用户记录的表【英文标题】:PL SQL - Procedure - table that holds a record of users who executed a procedure 【发布时间】:2016-09-25 18:41:05 【问题描述】:

如果问题已被提出,请提前致歉。我一直没能找到答案。

我想知道是否有一个表包含执行特定过程或函数的 oracle 用户名的记录。

我正在尝试创建一个可以被另一个过程作为子程序调用的过程。我要创建的过程将在每次执行其他过程时创建一个日志条目。下面的例子;

User_Name = 执行函数的人的 Oracle 用户名。

Name = 过程或函数的名称。

LastCompileDT = 上次编译函数或过程的日期/时间。

我有点不知道从哪里获取数据。 我遇到了 all_source 表,但它只给了我过程的所有者,而不是执行用户。

任何反馈都将不胜感激。

谢谢

【问题讨论】:

已经给出了很好的答案。但是,要记住的一件事是普通的存储过程将与调用存储过程一起回滚,这通常不是您想要的用于审计目的的存储过程。你可能想让你的审计存储过程自治 【参考方案1】:

可能有几种方法可以做到这一点。也许其他人可以建议一种从一个数据字典视图中提取所有这些数据的方法。但是,我的方法是这样的:

    User_Name:使用关键字USER。它返回执行该过程的 Oracle 用户:

    SELECT USER FROM DUAL;
    

    但是,如果您对执行该过程的操作系统用户感兴趣,那么您可以使用以下

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

    更多关于这个here。据我所知,这只能即时获取,默认情况下不会记录在任何地方。所以你需要在调用过程的时候运行它。

    程序名称:&

    LastCompileDT :可以从视图USER_OBJECTS获取

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

【讨论】:

谢谢鹰,这正是我要找的。​​span> 【参考方案2】:

您可以使用提供的内置审核表,而不是滚动您自己的审核。

见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 列和您的 User_Name/Name 的 OBJECT_NAME。

对于最后编译时间,请参阅 Hawk 的回答,或者如果您想查看最后 DDL 时间的历史记录,您可以将其添加到审核中

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

【讨论】:

以上是关于PL SQL - 过程 - 保存执行过程的用户记录的表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 存储过程

如何在pl / sql中同时在不同会话中执行存储过程

Oracle 12 PL/SQL 在触发器中检索存储过程名称

从 PL/SQL 中的过程返回值数组

什么是PL/SQL

并行执行 oracle PL/SQL [重复]