删除架构的所有对象

Sri*_*ant 5 oracle plsql oracle11g

下面的查询将删除当前用户A的架构(正常情况)中存在的所有表。

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)

但是,如果该查询由具有SYS或SYSDBA登录名的DBA运行,该怎么办?使用sys / sysdba用户登录时,user_objects视图中存在哪些对象?它会删除数据库中所有模式的所有表,还是查询会引发错误?目的是仅删除模式“ A”的对象。

Ale*_*ole 5

user_objects视图具有当前用户的对象,因此如果以 SYS 身份运行,它将尝试删除 SYS 的对象 - 非常糟糕的消息,因为它会破坏您的数据库。您可以在文档中了解 tthat 视图的三个版本。

为了让 SYS 看到另一个用户的对象,您应该查看dba_objects视图,过滤您感兴趣的用户;并在 drop 语句中也包含目标模式(所有者):

select 'drop ' || object_type || ' "' || owner || '"."' || object_name || '";'
from dba_objects
where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')
and owner = 'A';
Run Code Online (Sandbox Code Playgroud)

我还包括用双引号将对象名称(以及不太有用的所有者)括起来,以防有任何使用带引号的标识符创建的对象。


如果您在查询中包含表并尝试运行输出,您可能会因尝试以错误的顺序删除相关对象而出错,即在其子项之前删除父表。也有对象类型,但是如果您最终想要删除所有内容,删除并重新创建用户可能会更简单 - 也可以捕获和重新创建他们的权限。