Oracle SQL - 用于删除所有表,内容和数据文件的脚本

时间:2017-05-10 16:26:37

标签: sql oracle

我想创建一个SQL脚本,从数据库中删除所有表及其内容和数据文件。

这是否可以在不指定特定表的情况下实现?

这样的事情:

DROP ALL TABLESPACES 
  INCLUDING CONTENTS AND DATAFILES;

任何帮助?

1 个答案:

答案 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等。如果需要,您也可以完全删除用户。