如何删除所有用户表?

sza*_*man 155 oracle constraints sql-drop

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

我有约束的问题.当我禁用所有它仍然是不可能的.

Hen*_*Gao 287

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;
/
Run Code Online (Sandbox Code Playgroud)

  • 我认为该脚本可能很危险。如果您以SYSDBA身份连接,则它将删除所有用户的所有表以及所有系统表。实际上,您将删除整个数据库。小心! (3认同)
  • 这非常有效,并且不需要我在 Oracle 服务器上拥有删除和重新添加用户的权限。太棒了。很好的答案。 (2认同)

khy*_*ylo 198

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

select 'drop table '||table_name||' cascade constraints;' from user_tables;
Run Code Online (Sandbox Code Playgroud)

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

资料来源: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')
Run Code Online (Sandbox Code Playgroud)


kaz*_*aki 44

另一个对我有用的答案是(信用到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;
Run Code Online (Sandbox Code Playgroud)

请注意,这在运行后立即生效.它产生需要粘贴的地方(像其他的答案在这里)的脚本.它直接在DB上运行.

  • 这对我有用,但我必须通过写''DROP TABLE“' || c.table_name || '” CASCADE CONSTRAINTS'`来引用表名。如果表名是小写,这是必要的。 (2认同)

小智 21

begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 12

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

DROP USER username CASCADE
Run Code Online (Sandbox Code Playgroud)

  • 这不是正确的方法.这是一种在用户创建对象时删除用户的方法,这需要使用CASCADE在用户删除之前删除用户表.删除用户不是他问的问题. (5认同)
  • 如果模式很大,它确实非常有效地实现了目标.在您的情况下,似乎避免与您的DBA进行任何通信是一个高优先级.我更喜欢与您的DBA建立关系的解决方案 - 特别是如果您没有DBA权限. (3认同)
  • @Brian你认为错了.有时根本没有DBA,或者他在另一家公司.或者最常见的情况 - 他不会让你有机会做你需要的. (2认同)

小智 9

SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;
Run Code Online (Sandbox Code Playgroud)

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


TJR*_*TJR 6

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