现有一个问题:
  在处理一个业务时,发现一个表的某一条记录的某个字段值经常被修改成错误的值(每次修改都置为同一个值),
在对前台和后台程序检查后,查不到是哪个应用程序会做这样的修改,向各位高人请教下,如何捕获这条记录的
DML语句.
  尝试过以下方法,好象不可以:
  建立特定行的触发器,当该行被update时,查处执行该语句的sid
   select v$lock.sid
   from (select * from v$lock) v$lock, all_objects
   where sid > 6
   and v$lock.id1 = all_objects.object_id
   and object_name like '%MANAGER_TM_TEST%'  --要修改的表名
   然后根据下面的语句
   SELECT a.* 
     FROM v$sqltext a
     WHERE a.hash_value =
           (SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID)
   查出执行的语句;
 代码如下:create or replace trigger get_update_ssqll_manager_tm
  after update of state on manager_tm_test
  for each row
  when (old.manager_id = 1318)
declare
  v_sid number(10);
begin
  select v$lock.sid
    INTO V_SID
    from (select * from v$lock) v$lock, all_objects
   where sid > 6
     and v$lock.id1 = all_objects.object_id
     and object_name = 'MANAGER_TM_TEST';
  INSERT INTO get_update_ssqll_manager_msg
    SELECT a.*, seq_source_id.nextval
      FROM v$sqltext a
     WHERE a.hash_value =
           (SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID);
end;
  

解决方案 »

  1.   

    如果是归档的话,用logminer分析。
      

  2.   

    或者用audit,不过不是语句,只是action.
      

  3.   

    非想要得到更新的语句的话, SELECT   a.* 
              FROM   v$sqltext   a
              WHERE   a.hash_value   =
                          (SELECT   sql_hash_value   FROM   v$session   b   WHERE   b.SID   =   V_SID) 这样是不行的。
    会得到你之前的那个句子。可以通过v$sql里面去找更新你的这个表的最后一个记录,可以知道里面的信息。连接的话,除了hash_value,还需要ADDRESS。这两个关键词。