如何获取有关数据库事件和参与者信息的信息

时间:2013-08-07 12:39:21

标签: oracle

我有一个具有列状态的表员工,现在问题是有人(可能是包或触发器)更新状态值。如何获取有关用户ID和编程单元信息的信息。

我有一个解决方案在表上创建触发器以便在此表上进行更新,并从以下查询中捕获有关用户的信息

选择有关用户,用户计算机和会话信息的信息

select  s.sid
    ,   s.username
    ,   s.machine
    ,   s.program
    ,   s.module
    ,   s.event
    ,   s.service_name 
    ,   sh.USER_ID
    ,   sqls.sql_text
from SYS.V_$SESSION s
    ,V$ACTIVE_SESSION_HISTORY sh
    ,V$SQL sqls
    ,v$sqlarea sa
    ,v$sqlarea sap
where s.sid=sh.session_id
    and sqls.sql_id=sh.sql_id
    and UPPER(SQLS.SQL_TEXT) like '%UPDATE ABCD%STATUS%6%'
    and S.PREV_SQL_ID = SAP.SQL_ID (+)
    and sqls.sql_id = sa.sql_id (+)

但问题是如何获取更新此表的程序单元信息?

1 个答案:

答案 0 :(得分:0)

查看V$SESSIONMODULEACTIONCLIENT_INFO列。

然后,在您怀疑正在执行更新的软件包和/或触发器中,请致电DBMS_APPLICATION_INFO.SET_MODULEDBMS_APPLICATION_INFO.SET_ACTION

BEGIN
  DBMS_APPLICATION_INFO.SET_MODULE(trigger_name, 'trigger start');
  -- some code...
  DBMS_APPLICATION_INFO.SET_ACTION('updating employee');
  -- code which updates the employee table
  DBMS_APPLICATION_INFO.SET_ACTION('doing something else');
  -- more code...
  DBMS_APPLICATION_INFO.SET_MODULE(NULL, NULL);
END;

另请参阅usage notes中提供的示例。