2013-08-07 73 views
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 (+) 

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

+0

可能重复的[是否可以知道哪个程序包已被调用?](http://stackoverflow.com/questions/773928/is-it-possible-to-know-from-which-package -a-过程的过气的所谓) –

回答

0

MODULE,ACTIONCLIENT_INFO列的V$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; 

另见usage notes提供的例子。

相关问题