【问题标题】:How to drop all user tables?如何删除所有用户表?
【发布时间】:2010-12-14 00:11:08
【问题描述】:

如何在 oracle 中删除所有用户表?

我遇到了约束问题。当我禁用所有它仍然不可能。

【问题讨论】:

标签: oracle constraints sql-drop


【解决方案1】:
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;
/

【讨论】:

  • 这取决于您打算做什么。您也可以使用 drop user cascade,但您需要重新创建用户。
  • 这工作得很好,它不需要我在 Oracle 服务器上具有删除和重新添加我的用户的权限。太棒了。很好的答案。
  • 我得到 java.lang.IllegalArgumentException: No SQL selected for execution.. 我的想法是没有声明 cur_rec。由于这是一些由 bject_name、object_type 组成的,如何声明它?
  • 我认为脚本可能很危险。如果您以 SYSDBA 身份连接,它将删除所有用户的所有表以及所有系统表。实际上,您会删除整个数据库。小心!
  • 这对于在开发环境中拥有特定架构的权限但没有dba权限的用户很有用。
【解决方案2】:

如果您只是想要一个非常简单的方法来做到这一点.. 这是我过去使用过的脚本

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

这将为模式中的所有表打印出一系列删除命令。假脱机这个查询的结果并执行它。

来源: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')

【讨论】:

  • 这将失败与具有小写名称(或名称以数字开头或包含关键字)的表。 db<>fiddle。要解决此问题,查询应为 select 'drop table "'||table_name||'" cascade constraints;' from user_tables;
【解决方案3】:

另一个对我有用的答案是(感谢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;

请注意,这在您运行后立即起作用。它确实 NOT 会生成一个您需要粘贴到某处的脚本(就像此处的其他答案一样)。它直接在数据库上运行。

【讨论】:

  • 这对我有用,但我必须通过写 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS' 来引用表名。如果表名是小写的,这是必要的。
  • @ceving 很高兴知道这一点!我只使用大写表格,所以我从来没有遇到过这种情况。
  • +1 @ceving 也需要,以防您的表名是保留字。另外,我会在DROP 语句的末尾添加PURGE
  • 按照 ceving 的建议修复了引号。
  • ORA-24005:用于在 AQ 表上执行 DDL 的实用程序不合适
【解决方案4】:
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;

【讨论】:

    【解决方案5】:

    最简单的方法是使用 cascade 命令删除拥有对象的用户。

    DROP USER username CASCADE
    

    【讨论】:

    • 这不是正确的方法。这是一种在用户创建对象时删除用户的方法,需要在删除用户之前使用 CASCADE 删除用户表。删除用户不是他提出的问题。
    • 它确实非常有效地实现了目标,特别是在架构很大的情况下。在您的情况下,避免与您的 DBA 进行任何通信似乎是一个高优先级。我更喜欢与您的 DBA 建立关系的解决方案 - 特别是如果您没有 DBA 权限。
    • @Brian 你假设错了。有时根本没有 DBA,或者他在另一家公司。或者最常见的情况——他不会让你做你需要做的事情。
    • 刚接触Oracle,对MySQL比较熟悉;重置数据库似乎很困难。在 MySQL 中,USERDATABASE 是分开的。 DROP USER username CASCADE 为我工作。但在 MySQL 中,我所要做的就是 DROP DATABASE 并创建一个新的
    • 如果您有 1) 一个方便的“CREATE USER”脚本,它具有重新创建数据库的所有确切权限,则删除整个数据库(包括表)是有效的;和 2) 运行该脚本的权限。如果您需要做的只是删除表,那么其他提到的方法 (@kazanaki) 更合适。
    【解决方案6】:
    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
    FROM user_tables;
    

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

    【讨论】:

    • 不要忘记引号,否则无法删除带有小写字母的表格
    【解决方案7】:

    最简单的方法是删除表空间,然后重新构建表空间。但我宁愿不必那样做。这类似于亨利的,只是我只是在我的 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')
    

    【讨论】:

      【解决方案8】:

      删除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');
      

      【讨论】:

        【解决方案9】:

        请按照以下步骤操作。

        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;
        

        【讨论】:

          猜你喜欢
          • 2019-04-07
          • 1970-01-01
          • 1970-01-01
          • 2021-03-21
          • 1970-01-01
          • 1970-01-01
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多