我有一个具有列状态的表员工,现在问题是有人(可能是包或触发器)更新状态值。如何获取有关用户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 :(得分:0)
查看V$SESSION
的MODULE
,ACTION
和CLIENT_INFO
列。
然后,在您怀疑正在执行更新的软件包和/或触发器中,请致电DBMS_APPLICATION_INFO.SET_MODULE
和DBMS_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中提供的示例。