我正在運行一些測試以將數據從一個數據庫遷移到另一個數據庫,爲此我需要刪除並重新創建相同的表,視圖和其他內容。那麼什麼是Oracle中的SQL語句來刪除所有內容(刪除表,視圖,序列,函數,過程等)。我知道我可以使用「DROP」,但有時候這樣做不夠方便。從Oracle數據庫擦除數據
感謝
我正在運行一些測試以將數據從一個數據庫遷移到另一個數據庫,爲此我需要刪除並重新創建相同的表,視圖和其他內容。那麼什麼是Oracle中的SQL語句來刪除所有內容(刪除表,視圖,序列,函數,過程等)。我知道我可以使用「DROP」,但有時候這樣做不夠方便。從Oracle數據庫擦除數據
感謝
最簡單的方法是刪除模式的對象都關聯到:
DROP USER [schema name] CASCADE
核彈從軌道 - 這是可以肯定的唯一途徑;)
爲您提供的腳本,您可以運行這些查詢,而無需使用以下匿名過程生成中間腳本:
BEGIN
--Bye Views!
FOR i IN (SELECT uv.view_name
FROM USER_VIEWS uv) LOOP
EXECUTE IMMEDIATE 'drop view '|| i.view_name ||'';
END LOOP;
--Bye Sequences!
FOR i IN (SELECT us.sequence_name
FROM USER_SEQUENCES us) LOOP
EXECUTE IMMEDIATE 'drop sequence '|| i.sequence_name ||'';
END LOOP;
--Bye Tables!
FOR i IN (SELECT ut.table_name
FROM USER_TABLES ut) LOOP
EXECUTE IMMEDIATE 'drop table '|| i.table_name ||' CASCADE CONSTRAINTS ';
END LOOP;
--Bye Procedures/Functions/Packages!
FOR i IN (SELECT us.name,
us.type
FROM USER_SOURCE us
WHERE us.type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE')
GROUP BY us.name, us.type) LOOP
EXECUTE IMMEDIATE 'drop '|| i.type ||' '|| i.name ||'';
END LOOP;
--Bye Synonyms!
FOR i IN (SELECT ut.synonym_name
FROM USER_SYNONYMS us
WHERE us.synonym_name NOT LIKE 'sta%'
AND us.synonym_name LIKE 's_%') LOOP
EXECUTE IMMEDIATE 'drop synonym '|| i.synonym_name ||'';
END LOOP;
END;
我一直在方案之前,我做的是恢復備份和覆蓋當前的架構。
這樣我就可以回到原點了。
我已經found this script在哪裏你可以生成腳本來放棄一切,但如果我使用一些通用的東西,那將是非常棒的。
set feedback off
set pagesize 0
spool AllObjectsDrop.sql
select 'drop view '||view_name||';' from user_views;
select distinct 'drop sequence '||sequence_name|| ';'from user_sequences;
select distinct 'drop table '||table_name|| ';'from user_tables;
select distinct 'drop procedure '||name|| ';'from user_source where type = 'procedure';
select distinct 'drop function '||name|| ';'from user_source where type = 'function';
select distinct 'drop package '||name|| ';'from user_source where type = 'package';
select 'drop synonym '||synonym_name||';' from user_synonyms where synonym_name not like 'sta%' and synonym_name like 's_%'
spool off
如果您還沒有,請根據反饋檢查我的答案的更新。 – 2009-11-11 17:15:14
感謝您的幫助! – Maksim 2009-11-11 19:09:21
如果您有企業版,您應該查看restore points and Flashback Database。
DROP USER ... CASCADE很好,如果你有特權和一個快速的腳本來重新創建用戶。
在不能簡單地拖放模式,我使用以下腳本:
DECLARE
CURSOR c_get_objects IS
SELECT object_type, '"' || object_name || '"' || DECODE(object_type, 'TABLE', ' cascade constraints', NULL) obj_name
FROM user_objects
WHERE object_type IN ('TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'SYNONYM', 'MATERIALIZED VIEW')
ORDER BY object_type;
CURSOR c_get_objects_type IS
SELECT object_type, '"' || object_name || '"' obj_name FROM user_objects WHERE object_type IN ('TYPE');
BEGIN
FOR object_rec IN c_get_objects
LOOP
EXECUTE IMMEDIATE ('drop ' || object_rec.object_type || ' ' || object_rec.obj_name);
END LOOP;
FOR object_rec IN c_get_objects_type
LOOP
EXECUTE IMMEDIATE ('drop ' || object_rec.object_type || ' ' || object_rec.obj_name || ' force');
END LOOP;
END;
/
Bye proce/func/package部分將不起作用,因爲(1)NAME不是唯一的,(2)類型應該是大寫。如果有FK限制,我也不確定表格。 – jva 2009-11-11 09:27:45
以這種方式強制刪除表時,最好將CASCADE CONSTRAINTS子句放入生成的DROP TABLE語句中。否則,該聲明可能會失敗,ORA-02449。 – APC 2009-11-11 09:40:29
根據反饋進行更新。 – 2009-11-11 16:53:58