删除Oracle中架构上的所有对象

删除Oracle中架构上的所有对象,oracle,Oracle,我正试图构建一个脚本来删除数据库中的所有对象,因此使用下面的select,构建一个要执行的过程,该过程将使数据库保持完全干净(没有删除数据库并再次创建数据库的权限)。首先删除所有序列、索引等,然后删除表 select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION',

我正试图构建一个脚本来删除数据库中的所有对象,因此使用下面的select,构建一个要执行的过程,该过程将使数据库保持完全干净(没有删除数据库并再次创建数据库的权限)。首先删除所有序列、索引等,然后删除表

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')
考虑到这一点,我认为这样的方法可以奏效:

BEGIN

    FOR i IN (select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX'))
    LOOP
        EXECUTE IMMEDIATE i;
    END LOOP;

END;
/
但我得到:

错误报告-ORA-06550:第5行第27列:PLS-00382:表达式为 类型错误ORA-06550:第5行第9列:PL/SQL:语句被忽略 655000000-“行%s,列%s:\n%s” *原因:通常是PL/SQL编译错误。 *行动:


知道如何执行此操作吗?

executeimmediate
需要一个字符串(或varchar2)参数。您正在给它一个光标行。为所选值指定一个别名并将其用作参数,语句中不要包含分号,如下所示:

begin
  for i in (select 'drop ' || object_type || ' ' || object_name as stmt
              from user_objects
             where object_type in ('VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')) loop
    execute immediate i.stmt;
  end loop;
end;
/

出于测试目的,我使用Scott的模式。一旦污染太严重,我会放弃所有东西,除了Scott的默认表。这是我的剧本;看看这对你是否有帮助

请注意,您将不得不运行它几次,因为它不考虑外键约束,外键约束不允许您在主表的详细信息存在时删除主表,但这不会让我太烦恼

declare
  l_str varchar2(200);
begin
  for cur_r in (select object_name, object_type From user_objects 
                where object_name not in ('EMP', 'DEPT', 'BONUS', 'SALGRADE')
               )
  loop
    begin
      l_str := 'drop ' || cur_r.object_type || ' '|| cur_r.object_name;
      dbms_output.put_Line(l_str);
      execute immediate l_str;
    exception
      when others then null;
    end;
  end loop;
end;
/

为什么不干脆
删除用户。。。级联为什么要先删除索引,然后再删除表?如果删除表,表的所有索引也将被删除。那么具体化视图呢?
DROP
CREATE
用户当然很优雅,但需要额外的权限。只需跳过
“;”@wernfrieddomsheit user没有删除用户的权限(也不能删除自身)。你的意思是跳过“;”在select语句中?+1以获取帮助。当对象类型不可用时,这将引发错误。请确保您只传递所需的对象类型,如表、序列等。当您删除表时,它也会删除相关索引。因此,除非您有几个与表无关的索引,否则无需显式提及索引。错误为
ORA-02449:外键引用的表中的唯一/主键
@Bishan删除表的语句可以修改为:
删除表级联约束
。“层叠约束”选项还将删除引用被删除表的任何外键约束,从而避免该错误。@GriffeyDog Yeah,通过
层叠约束实现。感谢您的更新。实际问题是“删除所有对象”,IMHO应该包括哪些队列等。所以这仍然没有最终答案。我的猜测是,Oracle RDBMS需要像其他一些数据库一样适当地支持这一点。由于没有,因此没有完全可用的解决方案,您必须删除并重新创建用户。如果你没有相应的权限,它会以大量的手工操作结束:(当然,@Jörg。我不知道有谁会从用于生产目的的模式中删除所有对象。可能是出于教育目的(即每个新学生都有自己的干净模式),但我宁愿删除旧用户并导入一个新的干净用户。我发布的代码适合我的Scott用户,该用户用于回答我在各种Oracle论坛/网站上发现的问题。我懒得删除/导入,所以我运行该代码,我对它的功能感到满意。我知道,在生产环境中没有人这样做,但在靠近开发人员的测试环境中,这是一个问题对于liquibase或flyway来说,这是很正常的。顺便说一句:Oracle的另一种解决方法是创建SQL幂等元作为“不存在时创建”(伪语法,使用web搜索查找实际情况下的真实SQL)。