场景:
某天某猿,突然接到消息,要求提取一个陌生系统的后台数据。
我们的需求是什么?
不知道!
什么时候要?
现在要!
然而从系统仅能获取到表名,通过分析表的数据来源:
第一种情况是前台导入的。
第二种情况是有一个存储过程每天的向表内汇数据。
第三种情况放到linux服务器上的sql脚本。(crontab任务)
目前的情报:
表名,数据库
衍生推论:
1、因为报表中内容分析得到 < 包含聚合函数 > ,推测直接导入的概率不大
2、因为报表中内容分析得到 <且每日更新 > ,推测可能有job任务
2、通过查询存储过程包含字段的sql语句找到性应的存储过程(注意大小写)
结论:
是通过存储过程更改数据
没有对应的job
没有linux的crontab
不是前台导入的
是在一个job的存储过程中调用的该存储过程(额,有点绕)。
具体执行方案如下:
第一步:从数据库查看表的创建语句
select dbms_metadata.get_ddl('TABLE','EMP') from dual;
方法一:select * from tab;--(可以查看自己创建表或视图)
方法二:select * from user_tables;
方法三:select * from user_objects where object_type='TABLE' and object_name='';
方法四:select * from user_tab_columns;--(通过表名或字段名查找)
第二步:查询所有存储过程内是否包含该字段
select * from all_source where type='PROCEDURE' and upper(text) like '%EMP%'
第三步:查询shared_pool内操作语句
select * from v$sql where upper(sql_text) like '%EMP%' order by application_wait_time desc
第四步:dba_hist_*查询语句
select * from dba_hist_sqltext where upper(sql_text) like '%EMP%';
select * from dba_hist_sqltext
select * from dba_hist_sqlstat
select * from dba_hist_snapshot
以上,欢迎补充