(轉)Oracle中刪除使用者下所有物件的多種方法
方法1:
drop user XXXX cascade;
drop tablespace XXXX INCLUDING CONTENTS;
最省心的方法是級聯刪除 drop user XXXX cascade; 最後這個級聯特別有用(刪除使用者以及所有關聯的資料庫物件) 麻煩一點的辦法,把刪除語句做成儲存過程
註釋:
1、刪除使用者 然後重建,這樣最快:
1、在cmd中輸入 sqlplus / as sysdba 2、刪除使用者A,級所有和使用者A關聯的資料 drop user a cascade; 3、重建使用者A create user A identified by 密碼; grant connect,resource to A; 4、登入A使用者,就ok了 conn A/密碼 這個方法挺快的,還方便啊。
drop user xxx cascade這樣有些資料庫物件好像也刪除不了
有時候某些使用者被授予很複雜的許可權和角色,(若刪除使用者再建立使用者的方法會很繁瑣),所以還是衡量哪種方法更快,根據實際情況選擇
我常做db換版, 所以寫了上百個指令碼, 附上8個. 01_clear_recyclebin_plsql.sql 02_del_mviews_plsql.sql 有時確保 mview 避免刪除, 這個可以不執行 03_del_table_plsql.sql 04_del_function_plsql.sql 這個可以自由調整 05_del_scheduler_plsql.sql 06_del_program_plsql.sql 07_del_program_plsql.sql 08_del_synonyms_plsql.sql
刪除表時要先刪除其外來鍵再刪除表本身,其他資料庫物件貌似可以直接刪除自己:
begin -- 1、刪除外來鍵 for s in (select 'alter table ' || c.TABLE_NAME || ' drop constraint ' || c.CONSTRAINT_NAME text from user_constraints c where constraint_type = 'R') loop execute immediate s.text; end loop; -- 2、刪除物件(表等資料庫物件) for s in (select 'drop ' || o.OBJECT_TYPE || ' ' || o.OBJECT_NAME text from user_objects o where o.OBJECT_TYPE in ('FUNCTION', 'PROCEDURE', 'PACKAGE', 'SEQUENCE', 'TABLE')) loop execute immediate s.text; end loop; end; / --這個簡單點兒,可能不全面
http://www.itpub.NET/thread-849733-2-1.html
2、
刪除指定表空間是這樣: drop tablespace test1 including contents cascade constraints;之後還要手動刪除資料檔案,因為上述操作只是刪除了控制檔案和資料字典中的記錄。如果想簡單可以使用OEM來刪除,但我並不推薦。 刪除指定表空間下的表使用select table_name,tablespace_name from user_talbes;然後把這些表做刪除,可能會比較麻煩。 —————————————————— 因為我手上沒有oracle,所以看不到資料字典,我記得desc user_tables應該可以看到一個owner之類的,總之就是可以確定表格的歸屬,然後刪除。樓上說刪除使用者的方法也不是很好。如果不是很清楚依然可以使用oem操作,然後選擇顯示SQL,就可以看到了。
方法2:
寫儲存過程實現
DECLARE TYPE name_list IS TABLE OF VARCHAR2(40); TYPE type_list IS TABLE OF VARCHAR2(20);
Tab_name name_list:=name_list(); Tab_type type_list:=type_list();
sql_str VARCHAR2(500); BEGIN sql_str := 'select uo.object_name,uo.object_type from user_objects uo where uo.object_type not in(''INDEX'',''LOB'') order by uo.object_type desc'; EXECUTE IMMEDIATE sql_str BULK COLLECT INTO tab_name,tab_type;
FOR i IN Tab_name.FIRST.. Tab_name.LAST LOOP sql_str := 'DROP ' || Tab_type(i) || ' ' || Tab_name(i); EXECUTE IMMEDIATE sql_str; END LOOP; END;
http://www.php100.com/html/webkaifa/database/oracle/2010/1117/6832.html
*******************************************************************
ORACLE下刪除當前使用者下所有物件
- --刪除某個使用者下的物件
- set heading off;
- set feedback off;
- spool c:\dropobj.sql;
- prompt --Drop constraint
- select 'alter table '||table_name||' drop constraint '||constraint_name||' ;' from user_constraints where constraint_type='R';
- prompt --Drop tables
- select 'drop table '||table_name ||';' from user_tables;
- prompt --Drop view
- select 'drop view ' ||view_name||';' from user_views;
- prompt --Drop sequence
- select 'drop sequence ' ||sequence_name||';' from user_sequences;
- prompt --Drop function
- select 'drop function ' ||object_name||';' from user_objects where object_type='FUNCTION';
- prompt --Drop procedure
- select 'drop procedure '||object_name||';' from user_objects where object_type='PROCEDURE';
- prompt --Drop package
- prompt --Drop package body
- select 'drop package '|| object_name||';' from user_objects where object_type='PACKAGE';
- prompt --Drop database link
- select 'drop database link '|| object_name||';' from user_objects where object_type='DATABASE LINK';
- spool off;
- set heading on;
- set feedback on;
- @@c:\dropobj.sql;
- host del c:\dropobj.sql;
註釋: 1.上面這個語句,在pl/sql裡面是放在命令裡面執行的。 2.set heading off; 意思就是關閉表頭。如果不關閉,寫入dropobj.sql檔案中就會帶有結果集的表頭如: 'DROPTABLE'||TABLE_NAME||';' ------------------------------------------ drop table TEACHER; 實際上我們需要的是“drop table TEACHER;”,“'DROPTABLE'||TABLE_NAME||';' ”就是表頭。 3.set feedback off; 意思就是關閉回顯。如果不關閉,寫入dropobj.sql檔案中就會帶有返回結果集的大小等資訊,如:"137 rows selected" 4.spool c:\dropobj.sql; 把結果集寫入這個檔案。spool off; 結束寫入。 [email protected]@c:\dropobj.sql; 執行這個sql 6.host del c:\dropobj.sql; 刪除主機上這檔案。 7.CONSTRAINT_TYPE 就是鍵的型別:
- C (check constraint on a table)
- P (primary key)
- U (unique key)
- R (referential integrity)
- V (with check option, on a view)
- O (with read only, on a view)
8.當執行'drop package ………… '這句時,package body會被同時刪除。
http://www.iteye.com/topic/260823
http://blog.csdn.Net/xiaol_zhong/article/details/13094373
******************************************************
--delete tables Sql程式碼 select 'drop table ' || table_name ||';'||chr(13)||chr(10) from user_tables; select 'drop table ' || table_name ||';'||chr(13)||chr(10) from user_tables; --delete views Sql程式碼 select 'drop view ' || view_name||';'||chr(13)||chr(10) from user_views; select 'drop view ' || view_name||';'||chr(13)||chr(10) from user_views; --delete seqs Sql程式碼 select 'drop sequence ' || sequence_name||';'||chr(13)||chr(10) from user_sequences; select 'drop sequence ' || sequence_name||';'||chr(13)||chr(10) from user_sequences; --delete functions Sql程式碼 select 'drop function ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='FUNCTION'; select 'drop function ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='FUNCTION'; --delete procedure Sql程式碼 select 'drop procedure ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='PROCEDURE'; select 'drop procedure ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='PROCEDURE'; --delete package Sql程式碼 select 'drop package ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='PACKAGE'; select 'drop package ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='PACKAGE';
因為ORACLE等中大型資料庫一般不推薦採用批量刪除,因為效率會很慢,還是逐行刪除比較好。
http://zhidao.baidu.com/question/43963217.html?qbl=relate_question_0&word=oracle%C9%BE%B3%FD%D3%C3%BB%A7%CF%C2%CB%F9%D3%D0%B6%D4%CF%F3&optimi=4
==================================================================
1、如果有刪除使用者的許可權,則可以:
drop user user_name cascade;
加了cascade就可以把使用者連帶的資料全部刪掉。
刪除後再建立該使用者。 --建立管理員使用者 create user 使用者名稱 identified by 密碼 default tablespace space_data(表空間名稱) temporary tablespace space_temp(臨時表空間名稱); --授權 grant connect,dba to 使用者名稱; --修改限額 ALTER USER "使用者名稱" QUOTA UNLIMITED ON SPACE_DATA(表空間名稱);
--檢視所有使用者物件 select uo.object_name,uo.object_type from user_objects uo where uo.object_type<>'LOB' order by uo.object_type desc
2、如果沒有刪除使用者的許可權,則可以執行:
select 'drop table '||table_name||';' from cat where table_type='TABLE'
將會輸出一批刪除表的sql語句,這些SQL語句執行一下就可以了。(需要有drop table的許可權)
http://www.cnblogs.com/chshnan/archive/2012/02/07/2341694.html
如何刪除oracle中指定使用者下的所有表
在該使用者下寫一個儲存過程(要保證該使用者並不是以dba身份登入的,不然會把系統表都刪掉哦) create or replace procedure pro_droptable is cursor cur is select table_name from user_tables; drop_sql varchar2(1000); begin for tbname in cur loop begin drop_sql:='drop table '||tbname.table_name; execute immediate drop_sql; end; end loop; end pro_droptable; 然後執行就OK啦 執行語句:call pro_droptable()