如何查询谁删除了某张表数据

解决方案 »

  1.   

    Audit select ,insert ,delete on Table by access whenever successful
      

  2.   

    少年: 你去ORACLE 的回收站看看吧,都在那里面了。
      

  3.   

    logminer分析一下日志,前提在线日志未被覆盖。 
      

  4.   

    回收站可以查询被删除的数据 但是看不到谁删除的
    想要查看谁删的 就要建立触发器 在触发器中获取当前操作用户的各种信息 包括ip 用户名 执行的sql等你想要的信息就行
    下边是我以前写的一个例子 你可以参考一下
    --创建触发器
    create or replace trigger mw_app.mwt_ud_lp_pageinfo_modify
      after insert or update or delete on mw_app.mwt_ud_lp_pageinfo
      for each row
    /*监控mwt_ud_lp_pageinfo表的操作记录*/
    declare
      strname    varchar2(50) := 'mw_app.mwt_ud_lp_pageinfo';
      strtype    varchar2(20);
      strcontent varchar2(4000);
      bneedsave  boolean := true;
    begin
      if (:old.patternid = 16 or :new.patternid = 16) then
        if inserting then
          strtype    := 'insert';
          strcontent := strcontent || '#newserialnumber:' || :new.serialnumber;
        end if;
        if updating then
          if (:new.serialnumber - :old.serialnumber = 1) then
            bneedsave := false;
          end if;
          strtype    := 'update';
          strcontent := strcontent || '#oldserialnumber:' || :old.serialnumber ||
                        '#newserialnumber:' || :new.serialnumber;
        end if;
        if deleting then
          strtype    := 'delete';
          strcontent := strcontent || '#oldserialnumber:' || :old.serialnumber;
        end if;
        if (bneedsave) then
          strcontent := strcontent || '#SESSION_USER:' ||
                        SYS_CONTEXT('USERENV', 'SESSION_USER');
          strcontent := strcontent || '#HOST:' ||
                        SYS_CONTEXT('USERENV', 'HOST');
          for crsor in (select s.USERNAME,
                               s.OSUSER,
                               s.MACHINE,
                               s.TERMINAL,
                               s.PROGRAM,
                               sys_context('userenv', 'ip_address') as IPADDRESS,
                               q.sql_text sqltext1,
                               (select vs.sql_text
                                  from v$sql vs
                                 where vs.SQL_ID = s.SQL_ID) as sqltext2
                          from v$sql q, v$sql_cursor c, v$session s
                         where s.audsid =
                               (select userenv('SESSIONID') from dual)
                           and s.prev_sql_addr = q.address
                           AND c.STATUS = 'CURFETCH') loop
            strcontent := strcontent || '#USERNAME:' || crsor.username;
            strcontent := strcontent || '#OSUSER:' || crsor.OSUSER;
            strcontent := strcontent || '#MACHINE:' || crsor.MACHINE;
            strcontent := strcontent || '#TERMINAL:' || crsor.TERMINAL;
            strcontent := strcontent || '#PROGRAM:' || crsor.PROGRAM;
            strcontent := strcontent || '#IPADDRESS:' || crsor.IPADDRESS;
            strcontent := strcontent || '#SQLTEXT1:' || crsor.sqltext1;
    strcontent := strcontent || '#SQLTEXT2:' || crsor.sqltext2;
          end loop;
          insert into mw_app.mwt_ud_lp_operate_log
            (obj_id, create_time, table_name, operate_type, log_content)
          values
            (sys_guid(),
             systimestamp,
             strname,
             strtype,
             utl_raw.cast_to_raw(strcontent));
          dbms_output.put_line(strcontent);
        end if;
      end if;
    end;
      

  5.   

    只有通过logminer分析,其他没有办法!!
      

  6.   

    请问下 :old.patternid是什么意思
      

  7.   

    如果特别重要,就用logminer ,可以分析出来. 
    如果经常有类似需求,就打开审计,或者在表上加触发记录操作.