【问题标题】:Oracle SQL Query for listing all Schemas in a DB用于列出数据库中所有模式的 Oracle SQL 查询
【发布时间】:2011-06-17 12:50:49
【问题描述】:

我想删除我们的 oracle DB 上的一些未使用的模式。

如何查询所有架构名称?

【问题讨论】:

  • 你对“未使用”的定义是什么?
  • 我正在做一个数据迁移项目,每个开发人员都有自己的一组模式。 (部分开发者已离开,部分模式集不再使用)。

标签: oracle plsql


【解决方案1】:

使用 sqlplus

sqlplus / as sysdba

运行:

选择 * FROM dba_users

您是否只希望用户名执行以下操作:

选择用户名 FROM dba_users

【讨论】:

  • 请确保您对您的用户拥有权限。
  • @Andy:这就是我写“作为特权用户”的原因;)
  • @horse 抱歉,我错过了。
  • @a_horse_with_no_name 这是否意味着 oracle 中的模式意味着它是用户?我的意思是架构 = 用户?并在该用户下创建的所有表都像 MySQL 一样?
【解决方案2】:

很可能,你想要

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 提供的数据之前,请确保假设成立以这种方式构建模式。

【讨论】:

  • 将此与 FeRtoll 查询中的 where 谓词结合起来,您将获得一个相当安全(不太可能破坏 SYS 或 SYSTEM)的查询。
  • 这和select distinct owner from dba_objects 有什么不同?
  • 在一个干净的 Oracle 实例上,您的查询 @David 会产生一个额外的 PUBLIC 所有者
【解决方案3】:
SELECT username FROM all_users ORDER BY username;

【讨论】:

  • 如果您的用户没有dba_users 的权限,这非常有用(例如:错误ORA-00942 : table or view does not exist)
  • 但是 dba_users 和 all_users 之间的输出是否相同?
【解决方案4】:
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));

【讨论】:

  • 据我了解,此查询将显示包含任何表的所有模式。对吗?
  • 这只能在旧版本的 Oracle 中可靠地工作。通过延迟段创建,可以有一个没有段的对象。
【解决方案5】:

怎么样:

SQL> select * from all_users;

它将返回所有用户/模式的列表、他们的 ID 和在 DB 中创建的日期:

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1                         120 09-SEP-15
SCHEMA2                         119 09-SEP-15
SCHEMA3                         118 09-SEP-15

【讨论】:

    【解决方案6】:

    下面的sql列出了oracle中安装后创建的所有schema ORACLE_MAINTAINED='N' 是过滤器。此列是 12c 中的新列。

    select distinct username,ORACLE_MAINTAINED from dba_users where ORACLE_MAINTAINED='N';

    【讨论】:

      【解决方案7】:

      以下任一 SQL 都将返回 Oracle DB 中的所有架构。

      1. select owner FROM all_tables group by owner;
      2. select distinct owner FROM all_tables;

      【讨论】:

      • 可能存在仅包含非表对象的架构,您的查询不会列出这些架构。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多