如何删除所有用户表?


Answers:


294
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
这取决于您打算做什么。您还可以使用删除用户级联,但需要重新创建用户。
高Gao

1
这非常有效,并且不需要我在Oracle服务器上具有删除和重新添加用户的权限。太棒了 好答案。
djangofan 2011年

我收到java.lang.IllegalArgumentException:未选择要执行的SQL。我的想法是未声明cur_rec。由于这是由bject_name,object_type组成的,因此如何声明呢?
lijep大坝

3
我认为该脚本可能很危险。如果您以SYSDBA身份连接,则它将删除所有用户的所有表以及所有系统表。实际上,您将删除整个数据库。小心!
Zardo

对于在开发环境中具有特定架构的用户权限而不是dba权限的用户而言,这很有用。
亨利·高

201

如果您只是想要一种非常简单的方法来执行此操作。.这是我过去使用的脚本

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')

45

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

请注意,这在您运行后立即生效。它不是你需要(在这里像其他答案)粘贴的地方产生的脚本。它直接在数据库上运行。


1
这对我有用,但是我必须通过写引用表名'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'。如果表名是小写,这是必需的。
2012年

@ceving很高兴知道这一点!我只使用大写表,所以从未遇到过。
kazanaki 2012年

如果您的表名是保留字,也需要+1 @ceving。另外,我会PURGEDROP声明的末尾添加。
Грозный

修正了建议的报价。
kazanaki

ORA-24005:用于在AQ表上执行DDL的不当实用程序
Skylar Saveland,2014年


12

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

DROP USER username CASCADE

5
这不是正确的方法。这是一种在用户创建对象后删除用户的方法,该方法要求在删除用户之前使用CASCADE删除用户表。删除用户不是他所问的问题。
djangofan

3
它确实非常有效地实现了目标,尤其是在模式较大的情况下。在您的情况下,避免与DBA进行任何通信似乎是当务之急。我更喜欢与您的DBA建立关系的解决方案-特别是如果您没有DBA特权。
布莱恩

2
@布莱恩,你认为错了。有时根本没有DBA,或者他在另一家公司。或最常见的情况-他不会让您执行所需的操作。
kazanaki 2012年

刚接触Oracle时,我对MySQL更加熟悉。重置数据库似乎很困难。在MySQL中,a USER与分开DATABASEDROP USER username CASCADE为我工作。但在MySQL中的所有我必须做的是DROP DATABASE,创造一个新的
gawpertron

1
如果您有以下权限,这将有效地删除包括表在内的整个数据库:1)方便使用“ CREATE USER”脚本,该脚本具有重新创建数据库的所有确切权限;和2)允许运行该脚本的权限。如果您需要做的只是删除表,则其他提到的方法(@kazanaki)更合适。
Rana Ian

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')

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

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


不要忘记引号,否则您不能删除带有小写字母的表
masterxilo

2

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

1

请按照以下步骤操作。

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.