1

我有一个具有列状态的表员工,现在问题是有人(可能是包或触发器)更新状态值。如何获取有关用户 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 (+)

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

4

1 回答 1

0

查看MODULEACTIONCLIENT_INFOV$SESSION

然后,在您怀疑正在执行更新的包和/或触发器中,调用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;

另请参阅使用说明中提供的示例。

于 2013-08-07T13:17:02.800 回答