【发布时间】:2019-07-30 03:35:24
【问题描述】:
我希望能够显示 Oracle 连接中所有用户数据库的列表,不包括系统数据库。
有一种方法可以区分数据库中的用户表和系统表。但是我找不到任何方法可以过滤掉所有系统数据库。
有谁知道如何实现?
【问题讨论】:
标签: sql database oracle system
我希望能够显示 Oracle 连接中所有用户数据库的列表,不包括系统数据库。
有一种方法可以区分数据库中的用户表和系统表。但是我找不到任何方法可以过滤掉所有系统数据库。
有谁知道如何实现?
【问题讨论】:
标签: sql database oracle system
当连接到 oracle 时,您通常会连接到一个数据库,并且在该数据库中您将拥有许多模式。这些模式在其他一些 rdbms 系统中将被视为“数据库”。每个模式都由一个可以是系统用户或普通用户的 DB-User 拥有。在模式中创建的所有表/对象都由模式的所有者“拥有”。
因此,将系统表与用户表分开的粗略方法是将系统用户拥有的模式中的表视为系统表。
如果在 12c 及以上版本的数据库中,您可以这样做:
select t.table_name, t.owner, u.oracle_maintained
from dba_tables t, dba_users u
where t.owner = u.username
and rownum < 100;
如果版本低于 12c,则 oracle_maintained 列不存在,因此您需要此解决方法。 35 应该设置为系统用户的最高 used_id。系统用户通常是数据库中最低的。
select t.table_name, t.owner, case when u.user_id > 35 then 'N' else 'Y' end systemgenerated
from dba_tables t, dba_users u
where t.owner = u.username
and rownum < 100;
另外:'and rownum
【讨论】:
我可以在另一篇帖子的帮助下找到我的问题的确切答案 - Oracle SQL Query for listing all Schemas in a DB
这是我需要的查询:
> SELECT * FROM dba_users u WHERE EXISTS (SELECT 1 FROM dba_objects o
> WHERE o.owner = u.username ) AND default_tablespace not in
> ('SYSTEM','SYSAUX') and ACCOUNT_STATUS = 'OPEN'
这将列出您数据库中的所有非系统用户/模式(也称为数据库)。确保您已以 SYS 用户身份登录,或者您授予“GRANT SELECT ON dba_users TO the_non_sys_user”
【讨论】: