Oracle SQL查询以列出数据库中的所有模式。
很可能你想要的是:
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提供的模式之前,请确保这些假设是成立的。