几天前修改过存储过程,放了个小长假回去给忘记了,发现测试库编译错误就直接从生产库导出最新的全部覆盖。就在编译成功后沾沾自喜时发现有个程序放假前修改过并在测试库测试,覆盖之后这个程序相当于撤销了之前的操作。好在Oracle的机制很人性化,基本上不管怎么删除都能找回来。存储过程的还原三步搞定。
1、切换到管理员,这些操作普通用户没有权限
2、新建一张表存放某个具体时间的存储过程信息
create table lwz_tmp as
select *
from dba_source as of timestamp TO_TIMESTAMP('2020-12-31 20:33:00', 'YYYY-MM-DD HH24:MI:SS')
where TYPE = 'PROCEDURE'
And owner = 'LWZ'
And Name = 'MYPRO';
3、上面就已经得到了覆盖前的存储过程,再从中取text字段就是里面每一行的内容
select text
from lwz_tmp
where name ='MYPRO'
and owner = 'LWZ'
order by line;
可以将text全部作为excel导出,再取对应的文字列(导出第一列为序号)复制到notepad或者txt上,替换掉多余的"双引号,稍微调整即可。同理,还原某个时间的数据也可以用到timestamp TO_TIMESTAMP(),但是用了truncate无法用这个还原,谨慎使用,尽管delete速度比truncate慢很多,也尽量用delete!!!