如何查询谁删除了某张表数据 如何查询谁删除了某张表数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Audit select ,insert ,delete on Table by access whenever successful 少年: 你去ORACLE 的回收站看看吧,都在那里面了。 logminer分析一下日志,前提在线日志未被覆盖。 回收站可以查询被删除的数据 但是看不到谁删除的想要查看谁删的 就要建立触发器 在触发器中获取当前操作用户的各种信息 包括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; 只有通过logminer分析,其他没有办法!! 请问下 :old.patternid是什么意思 如果特别重要,就用logminer ,可以分析出来. 如果经常有类似需求,就打开审计,或者在表上加触发记录操作. RMAN恢复时报错,请教大神们 初学鸟的问题.. 请问怎样才能方便的删除前350个表? 如何在程序中创建Oracle用户? oracle Enterprise console 登陆出错???急~~~~~~~~~~``` 我想在存储过程中加入条件?怎么处理? 表列自增的问题 怎么利用timestamp(2)进行查询条件的设置(在线等待,铁定给分) ORACLE高手请来帮忙! 考勤软件连接不了oracle数据库 求教一条SQL语句 web services 服务使用oracle(9i)处理业务
想要查看谁删的 就要建立触发器 在触发器中获取当前操作用户的各种信息 包括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;
如果经常有类似需求,就打开审计,或者在表上加触发记录操作.