【发布时间】:2011-06-17 12:50:49
【问题描述】:
我想删除我们的 oracle DB 上的一些未使用的模式。
如何查询所有架构名称?
【问题讨论】:
-
你对“未使用”的定义是什么?
-
我正在做一个数据迁移项目,每个开发人员都有自己的一组模式。 (部分开发者已离开,部分模式集不再使用)。
我想删除我们的 oracle DB 上的一些未使用的模式。
如何查询所有架构名称?
【问题讨论】:
使用 sqlplus
sqlplus / as sysdba
运行:
选择 * FROM dba_users您是否只希望用户名执行以下操作:
选择用户名 FROM dba_users【讨论】:
很可能,你想要
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 提供的数据之前,请确保假设成立以这种方式构建模式。
【讨论】:
select distinct owner from dba_objects 有什么不同?
SELECT username FROM all_users ORDER BY username;
【讨论】:
dba_users 的权限,这非常有用(例如:错误ORA-00942 : table or view does not exist)
select distinct owner
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
【讨论】:
怎么样:
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
【讨论】:
下面的sql列出了oracle中安装后创建的所有schema ORACLE_MAINTAINED='N' 是过滤器。此列是 12c 中的新列。
select distinct username,ORACLE_MAINTAINED from dba_users where ORACLE_MAINTAINED='N';
【讨论】:
以下任一 SQL 都将返回 Oracle DB 中的所有架构。
select owner FROM all_tables group by owner;select distinct owner FROM all_tables;【讨论】: