我想创建一个SQL脚本,从数据库中删除所有表及其内容和数据文件。
这是否可以在不指定特定表的情况下实现?
这样的事情:
DROP ALL TABLESPACES
INCLUDING CONTENTS AND DATAFILES;
任何帮助?
答案 0 :(得分:2)
我相信您无法删除 所有 表空间 - 数据库不允许删除默认表空间,并且当然禁止删除SYSTEM
表空间。
还有一些其他特殊的表空间和other restrictions关于删除表空间,特别是当对象在多个表空间中有组件时。假设情况并非如此,您可以删除大部分表并通过DROP TABLESPACE
清理数据文件。
您的oracle版本未在问题中指定,但根据您的oracle版本,您可能会在删除时使用不同的子句。
我将在下面的10G中概述一种方法,但如果你在12c,你也可以考虑配额。 12c doc here
正如您在问题中所包含的那样,在INCLUDING CONTENTS AND DATAFILES
命令中使用子句DROP TABLESPACE
时,可以包含删除(和删除)数据文件(和表)。
请记住删除表空间的限制(取决于数据库的状态,某些表空间可能需要干预),下面可能是一个起点。这将迭代所有表空间(禁止的表空间除外)并逐个删除它们,打印遇到的任何错误。 Dan Bracuk也在评论中提到了这种方法。此处使用CASCADE CONSTRAINTS
强制删除,尽管其他表空间中包含依赖项对象。
BEGIN
FOR TABLESPACE_POINTER IN (
SELECT TABLESPACE_NAME
FROM DBA_TABLESPACES
WHERE TABLESPACE_NAME NOT IN
('SYSTEM','SYSAUX',
(SELECT PROPERTY_VALUE
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE'))
) LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Dropping tablespace:%s', TABLESPACE_POINTER.TABLESPACE_NAME));
EXECUTE IMMEDIATE 'DROP TABLESPACE ' || TABLESPACE_POINTER.TABLESPACE_NAME || ' INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS';
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Could not drop tablespace: %s Reason: %s', TABLESPACE_POINTER.TABLESPACE_NAME, SQLERRM));
END;
END LOOP;
END;
/
编辑:根据您发表的关于不放弃TABLESPACE
而非TABLE
的评论,我建议使用以下示例。
由于您的表可能会或可能不会与其他用户的表共享表空间并且存在于相同的数据文件中,我建议不要担心数据文件(甚至表空间),而是专注于删除表格。 Oracle可以管理这个空间。如果要确保立即回收为表分配的数据,可以使用PURGE
子句。
以下是一个例子。
我们从没有桌子开始。
SELECT COUNT(*) FROM USER_TABLES;
COUNT(*)
0
然后创建表格(本例中的电影):
CREATE TABLE DIRECTOR(DIRECTOR_ID NUMBER PRIMARY KEY);
CREATE TABLE MOVIE(WOOKIE_ID NUMBER, DIRECTOR_ID REFERENCES DIRECTOR(DIRECTOR_ID));
Table DIRECTOR created.
Table MOVIE created.
第二个表有第一个的外键,所以如果我们试图放入错误的顺序',数据库将阻止我们:
DROP TABLE DIRECTOR;
Error report -
ORA-02449: unique/primary keys in table referenced by foreign keys
为了减轻这种情况,我们可以{1}在我们放弃时使用以下语法:
CASCADE CONSTRAINTS
因此,为了获得所有表,您只需要自动生成drop命令。就像在第一个DROP TABLE DIRECTOR CASCADE CONSTRAINTS PURGE;
Table DIRECTOR dropped.
示例中一样,我将遍历此用户表的列表,然后逐个删除它们:
TABLESPACE
结果:
BEGIN
FOR TABLE_POINTER IN (
SELECT TABLE_NAME
FROM USER_TABLES ) LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Dropping table:%s', TABLE_POINTER.TABLE_NAME));
EXECUTE IMMEDIATE UTL_LMS.FORMAT_MESSAGE('DROP TABLE %s CASCADE CONSTRAINTS PURGE',TABLE_POINTER.TABLE_NAME);
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Could not drop table: %s Reason: %s', TABLE_POINTER.TABLE_NAME, SQLERRM));
END;
END LOOP;
END;
/
您可以对其他对象类型执行相同操作 - Dropping table:MOVIE
Dropping table:DIRECTOR
PL/SQL procedure successfully completed.
s,VIEW
等。如果需要,您也可以完全删除用户。