直接查DBA_USERS即可获取用户名、状态和创建时间,需DBA权限;字段CREATED默认显示格式易误判年份,应使用TO_CHAR(created,'yyyy-mm-dd hh24:mi:ss')显式格式化;WHERE条件用户名须大写;ACCOUNT_STATUS为单字段枚举值,含复合状态如'EXPIRED & LOCKED'。
DBA_USERS 就能拿到创建日期和状态不需要拼接视图或查底层基表,dba_users 本身已包含 created 和 account_status 字段。前提是当前用户有 select any dictionary 或 dba 角色权限——没权限时会报 ora-00942: table or view does not exist。
最简命令就是:
SELECT username, account_status, created FROM dba_users;
常见错误是漏掉 ORDER BY created,导致新老用户混在一起难定位;也有人误用 ALL_USERS,但它不带 ACCOUNT_STATUS 和 CREATED(只含 USERNAME、USER_ID、CREATED),字段不全。
CREATED 字段默认显示格式太短,看不清年份Oracle 默认把 DATE 类型显示成类似 01-JAN-24 的格式,容易误判为 2024 年而非 2026 年——尤其当数据库运行多年、用户跨年代创建时。
必须显式格式化:
SELECT username, account_status, TO_CHAR(created, 'yyyy-mm-dd hh24:mi:ss') AS created FROM dba_users;
TO_CHAR(created, 'yyyy-mm-dd') 足够识别年份,加 hh24:mi:ss 可排查同日创建的多个账号TO_DATE() 套 CREATED,那是反向操作,会出错col created format a20 避免字段被截断WHERE 条件要大写用户名Oracle 的 USERNAME 列存储的是大写形式,即使你建用户时用了小写(如 create user "test" identified by pwd),在 DBA_USERS 中仍存为 TEST。
所以:
WHERE username = 'HR'、WHERE username = 'SCOTT'
WHERE username = 'hr'(查不到)、WHERE UPPER(username) = 'HR'(走不了索引,慢)SELECT DISTINCT username FROM dba_users 看一眼真实值EXPIRED & LOCKED 是复合状态,不是两个独立字段ACCOUNT_STATUS 是单字段枚举值,常见值包括 OPEN、LOCKED、EXPIRED、EXPIRED & LOCKED、EXPIRED(GRACE) 等。它不拆分成“是否过期”和“是否锁定”两个布尔值。
这意味着:
WHERE account_status = 'EXPIRED' 漏掉 EXPIRED & LOCKED 用户WHERE account_status NOT IN ('OPEN', 'EXPIRED(GRACE)')
LOCK_DATE 和 EXPIRY_DATE 字段可能为空,但 ACCOUNT_STATUS 才是唯一权威状态标识真正容易被忽略的是:ACCOUNT_STATUS 的值依赖密码策略(PROFILE)和用户上次登录行为,不是静态快照——刚改密或解锁后,状态不会立刻刷新,有时需等下次认证才更新。