如何删除所有用户表?

180
我该如何在oracle中删除所有用户表?
我遇到了约束的问题。即使我将所有约束都禁用了,仍然无法进行操作。

不妨删除约束条件,而不是禁用它们? - David Aldridge
http://www.dbasupport.com/forums/showthread.php?48689-script-to-drop-all-user-objects - Vadzim
10个回答

322
BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                   FROM user_objects
                   WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'MATERIALIZED VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'SYNONYM',
                              'PACKAGE BODY'
                             ))
   LOOP
      BEGIN
         IF cur_rec.object_type = 'TABLE'
         THEN
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '" CASCADE CONSTRAINTS';
         ELSE
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '"';
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line ('FAILED: DROP '
                                  || cur_rec.object_type
                                  || ' "'
                                  || cur_rec.object_name
                                  || '"'
                                 );
      END;
   END LOOP;
   FOR cur_rec IN (SELECT * 
                   FROM all_synonyms 
                   WHERE table_owner IN (SELECT USER FROM dual))
   LOOP
      BEGIN
         EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
      END;
   END LOOP;
END;
/

1
这取决于您打算做什么。您也可以使用“drop user cascade”,但需要重新创建用户。 - Henry Gao
2
这个方法非常有效,而且不需要我在Oracle服务器上拥有权限来删除和重新添加我的用户。太棒了,回答得真好。 - djangofan
1
我收到了java.lang.IllegalArgumentException: No SQL selected for execution.的错误信息。我的想法是cur_rec没有被声明。由于它是由object_name和object_type组成的一些内容,该如何声明它? - lijep dam
6
我认为该脚本可能很危险。如果您以SYSDBA身份连接,它会删除所有用户的所有表,包括所有系统表。实际上,您会删除整个数据库。要小心! - Neo
下次我会在尝试之前阅读注释。因为我以SYSDBA身份登录,所以我刚刚把我的数据库搞炸了。 - Danny Lo
显示剩余2条评论

220

如果你只是想要一种真正简单的方法来做这件事... 这是我过去使用过的一个脚本

select 'drop table '||table_name||' cascade constraints;' from user_tables;

这将为模式中的所有表打印一系列删除命令。将此查询的结果存储到 Spool 中并执行它。

来源: https://forums.oracle.com/forums/thread.jspa?threadID=614090

同样,如果您想清除多个表格,可以编辑以下内容以满足您的需求。

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

1
这将在表名为小写字母(或以数字开头或包含关键字的表)时失败。db<>fiddle。要解决此问题,查询应该是select 'drop table "'||table_name||'" cascade constraints;' from user_tables; - MT0

55

对我有用的另一个答案是(感谢http://snipt.net/Fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/

BEGIN

FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;

FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;

END;

请注意,此操作会在您运行它后立即生效。它不会产生需要在其他地方粘贴的脚本(如其他答案所示),而是直接在数据库上运行。


2
这对我有效,但我必须通过编写'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'来引用表名。如果表名是小写,则这是必要的。 - ceving
@ceving 很高兴知道这个!我只使用大写表,所以我从未遇到过这种情况。 - kazanaki
+1 @ceving,如果您的表名是保留字,也需要这样做。此外,我会在DROP语句的末尾添加PURGE - Ruslan
按照ceving的建议修复了引号。 - kazanaki
ORA-24005:使用不当的工具在AQ表上执行DDL。 - Skylar Saveland
是的,这意味着您在Oracle中有一个“高级队列”表。在您的情况下,删除命令需要不同的方式。在SO上有其他问题解释了这种情况。您尝试过使用DBMS_AQADM.DROP_QUEUE_TABLE吗? - kazanaki

22
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;

14

最简单的方法是使用级联命令删除拥有这些对象的用户。

DROP USER username CASCADE

8
这不是正确的方法。这是针对用户创建了对象后删除用户的一种方法,需要使用CASCADE在删除用户之前删除用户表。但他所问的不是如何删除用户。 - djangofan
3
特别是当架构很大时,它确实非常有效地实现了目标。看起来在你的情况下,避免与你的DBA进行任何沟通是很重要的。我更喜欢那些能够促进与你的DBA关系的解决方案 - 特别是如果你没有DBA权限的话。 - Brian
2
@Brian,你的假设是错误的。有时候根本没有数据库管理员,或者他在另一家公司。或者最常见的情况是 - 他不会给你访问权限去做你需要做的事情。 - kazanaki
作为一个新手,我更熟悉MySQL,对于Oracle数据库的重置似乎有些困难。在MySQL中,“用户”和“数据库”是分开的。使用“DROP USER username CASCADE”命令可以解决问题。但是在MySQL中,我只需要使用“DROP DATABASE”命令并创建一个新的数据库即可。 - gawpertron
1
如果您有以下两个条件:1)具备一个“CREATE USER”脚本,其中包含重新创建数据库所需的所有确切权限;2)拥有运行该脚本的权限,则删除整个数据库(包括表)是有效的。如果您只需要删除表,则其他提到的方法(@kazanaki)更为适合。 - Rana Ian

10
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables是包含用户所有表的系统表。SELECT子句将为每个表生成DROP语句。您可以运行该脚本。

Translated:

user_tables是一个系统表,其中包含了所有用户的表。SELECT语句将会为每个表生成一个DROP语句。您可以运行这个脚本。


"不要忘记引号,否则您将无法删除带有小写字母的表格。" - masterxilo

7
最简单的方法是删除表空间,然后重新构建表空间。但我不想这样做。与Henry的方法类似,我只是在我的GUI中对结果集进行复制/粘贴。
SELECT
  'DROP'
  ,object_type
  ,object_name
  ,CASE(object_type)
     WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
     ELSE ';'
   END
 FROM user_objects
 WHERE
   object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')

4
要删除 Oracle 中的所有对象:
1)动态方式
DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' SCHEMA_NAME.'||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' SCHEMA_NAME.'||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' SCHEMA_NAME.'||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) 静态

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');

3
请按照以下步骤进行操作。
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tb from user_tables) 
  loop
     execute immediate i.tb;
  end loop;
  commit;
end;
purge RECYCLEBIN;

0
你可以使用DBeaver数据库工具连接到你的数据库,然后选择所有的表,右键点击并选择删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接