建一个监控ddl 的triggerconn / as sysdba create trigger tr_trace_ddl AFTER DDL ON DATABASE DECLARE sql_text ora_name_list_t; state_sql ddl$trace.ddl_sql%TYPE; BEGIN FOR i IN 1..ora_sql_txt(sql_text) LOOP state_sql := state_sql||sql_text(i); END LOOP; INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid, schema_user,schema_object,ddl_sql) VALUES(ora_login_user,SYSDATE,sys_context('USERENV','IP_ADDRESS'),userenv('SESSIONID'), ora_dict_obj_owner,ora_dict_obj_name,state_sql); EXCEPTION WHEN OTHERS THEN raise; END tr_trace_ddl; /
谢谢你的回复。如果是人为操作,那么,是否会留下操作的日志呢?在系统日志当中,没有看到有人执行drop命令。请问,使用system登录后,和使用其它用户登录,使用的sql有什么差别吗?我没用过oracle,这是头一次使用。公司有一个管理员,但,他也没找到问题。
是不是有人用那个帐户误操作了?还是权限分配不对导致普通帐户搞坏了系统表???
还有,你看一下是不是有的客端上装了PB等工具.如果有用户点了"橡皮擦",表就会被删除
create trigger tr_trace_ddl
AFTER DDL ON DATABASE
DECLARE
sql_text ora_name_list_t;
state_sql ddl$trace.ddl_sql%TYPE;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
state_sql := state_sql||sql_text(i);
END LOOP;
INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid,
schema_user,schema_object,ddl_sql)
VALUES(ora_login_user,SYSDATE,sys_context('USERENV','IP_ADDRESS'),userenv('SESSIONID'),
ora_dict_obj_owner,ora_dict_obj_name,state_sql);
EXCEPTION
WHEN OTHERS THEN
raise;
END tr_trace_ddl;
/