昨天一位同事在执行创建数据库全量对象脚本时,在sys用户下执行了,那些本来应该在应用用户下创建的对象,不小心创建在了sys用户下。由于创建的对象是一个脚本执行的,里面有近1500个对象,要是一个一个删除,那是不可能了。
由于测试部的同事急着要用,先在应用用户下重新把创建数据库对象的全量脚本再次执行了一次,system表空间下的那些对象后续再说……
今天趁着有时间,上去清理了一下那些对象:
1.创建一个临时表,里面的内容是哪些对象是在sys下,且是昨天创建的对象:
1 2 3 4 5 6 7 8 |
SQL> show user USER is "SYS" SQL> create table MISC.hjm_tmp_forcheck as select OBJECT_TYPE,OBJECT_NAME from user_objects where trunc(LAST_DDL_TIME)=trunc(sysdate-1) order by 1,2 2 / Table created. SQL> |
2.创建另一个临时表,里面的内容是哪些对象是昨天在应用用户下建立的:
1 2 3 4 5 6 7 8 |
SQL> conn appuser/apppwd Connected. SQL> create table MISC.hjm_tmp_misc17ini as select OBJECT_TYPE,OBJECT_NAME from user_objects where trunc(LAST_DDL_TIME)=trunc(sysdate-1) order by 1,2; Table created. SQL> SQL> |
3.生成动态sql,这些对象是在应用用户下存在的,且也在sys用户下存在的——即取交集。
1 2 3 4 5 6 7 8 9 10 |
SQL> select 'drop '||decode(OBJECT_TYPE,'TABLE PARTITION','TABLE','PACKAGE BODY','PACKAGE',OBJECT_TYPE)|| ' '||OBJECT_NAME ||' ;' FROM (select * from MISC.hjm_tmp_misc17ini INTERSECT select * from MISC.hjm_tmp_forcheck) 2 / 'DROP'||DECODE(OBJECT_TYPE,'TABLEPARTITION','TABLE','PACKAGEBODY','PACKAGE',OBJECT_TYPE)||''||OBJECT_NAME||';' ---------------------------------------------------------------------------------------------------------------------------------------------------------- drop INDEX PK_DISCOUNT_PLAN_DISCTPLANID ; drop INDEX PK_DISCOUNT_RULE_DISCTRULEID ; …… drop TABLE DISCOUNT_RULE ; |
4.执行上述生成的sql两到三次即可。(需要执行2~3次是因为有些对象有外键约束,第一次无法删除,要先删除外键的对象)
4条评论
学习了
应该我也会弄了
不过建表的那位老兄也真的够厉害的!
怎么不用alter table xx move tablespace yy、alter index tt rebuild table space yy做呢
The scripts for create both tables and indexes in the user’s default tablespace?