查用户默认表空间需据权限选视图:dba权限用dba_users加where username='scott'(注意大写),无dba权限则用user_users;cdb环境须先alter session set container切到目标pdb。
直接查 dba_users 就能拿到用户默认表空间,但必须有 dba 权限,且用户名区分大小写。
查指定用户的默认表空间要加 WHERE 条件
不加条件会返回全部用户,数据量大时慢、难定位。用 WHERE username = 'XXX' 最稳妥,注意 Oracle 默认把用户名转成大写,所以 'scott' 要写成 'SCOTT':
SELECT default_tablespace, temporary_tablespace FROM dba_users WHERE username = 'SCOTT';
- 如果记不清大小写,可用
UPPER()包裹:WHERE UPPER(username) = 'SCOTT' - 多个用户一起查用
IN:WHERE username IN ('SCOTT', 'HR', 'OE') - 模糊匹配慎用
LIKE,dba_users表可能有上百行,LIKE '%SYS%'容易扫全表
没 DBA 权限时只能查自己的默认表空间
普通用户没有访问 dba_users 的权限,但可以查 user_users(只有一行):
SELECT default_tablespace, temporary_tablespace FROM user_users;
-
user_users不需要任何额外权限,每个用户都能查 - 它只返回当前登录用户的信息,不能用来查别人
- 字段名和
dba_users一致,脚本迁移成本低
查不到结果的常见原因
执行 SELECT ... FROM dba_users WHERE username = 'XXX' 返回空,不是语法错,而是下面几个原因:
- 用户名拼错,比如
'sys'写成'SYS'是对的,但写成'system'就查不到SYS - 当前连接用户没被授
SELECT_CATALOG_ROLE或DBA角色,权限不足导致无结果(不是报错) - 用户是外部认证(如 OS 认证)或全局用户,在
dba_users中可能显示为EXTERNAL或为空值 - Oracle 12c 及以后的多租户环境里,
dba_users默认只查 CDB$ROOT,要查 PDB 用户得先ALTER SESSION SET CONTAINER = xxx;
真正容易被忽略的是权限上下文和容器切换——很多 DBA 在 CDB 环境下直接连上就查,却忘了当前 container 是不是目标 PDB。











