用于列出数据库中所有模式的Oracle SQL查询

我想在我们的oracle数据库上删除一些未使用的模式。

我怎样才能查询到所有模式的名称?

解决办法

使用sqlplus

sqlplus / as sysdba

运行。

选择 *
FROM dba_users

如果你只想获得用户名,请执行以下操作。

选择用户名
FROM dba_users
评论(5)

最有可能的是,你想

SELECT username
  FROM dba_users

这将显示系统中的所有用户(以及所有潜在的模式)。 如果你对"模式"的定义允许一个模式为空,那就是你想要的。 然而,可能会有一种语义上的区别,即人们只想把某个东西称为模式,如果它确实拥有至少一个对象的话,这样就可以排除那些永远不会拥有任何对象的数百个用户账户。 在这种情况下

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )

假设创建模式的人在分配默认表空间方面是明智的,并且假设你对Oracle已经交付的模式不感兴趣,你可以通过在default_tablespace上添加谓词来过滤掉这些模式,即

SELECT username
  FROM dba_users
 WHERE default_tablespace not in ('SYSTEM','SYSAUX')

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )
   AND default_tablespace not in ('SYSTEM','SYSAUX')

不过,在系统中,有人错误地给非系统用户设置了default_tablespace'为SYSTEM',这种情况并不罕见,所以在尝试用这种方式过滤掉Oracle交付的模式之前,要确定这些假设是成立的。

评论(3)
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
评论(2)