误将对象创建在system表空间中
昨天一位同事在执行创建数据库全量对象脚本时,在sys用户下执行了,那些本来应该在应用用户下创建的对象,不小心创建在了sys用户下。由于创建的对象是一个脚本执行的,里面有近1500个对象,要是一个一个删除,那是不可能了。
由于测试部的同事急着要用,先在应用用户下重新把创建数据库对象的全量脚本再次执行了一次,system表空间下的那些对象后续再说……
今天趁着有时间,上去清理了一下那些对象:
1.创建一个临时表,里面的内容是哪些对象是在sys下,且是昨天创建的对象:
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>
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.创建另一个临时表,里面的内容是哪些对象是昨天在应用用户下建立的:
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>
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用户下存在的——即取交集。
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 ;
' '||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次是因为有些对象有外键约束,第一次无法删除,要先删除外键的对象)
· 【文章发布信息】发表于: 2008-06-08 @ 00:35:17 · ||分类: ..experience, Working case



CopyRight ©
dbaeyes 于 2008-06-15 @ 23:42:24 留言 :
学习了
应该我也会弄了
dbaeyes 于 2008-06-15 @ 23:42:54 留言 :
不过建表的那位老兄也真的够厉害的!
匿名 于 2008-06-30 @ 14:08:24 留言 :
怎么不用alter table xx move tablespace yy、alter index tt rebuild table space yy做呢
yanggq 于 2009-05-04 @ 23:10:40 留言 :
The scripts for create both tables and indexes in the user’s default tablespace?