最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
怎样查看Oracle数据库中所有用户的账号创建日期和状态
时间:2026-07-11 09:44:47 编辑:袖梨 来源:一聚教程网
直接查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,那是反向操作,会出错 - 如果用 SQL*Plus,顺手加
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)和用户上次登录行为,不是静态快照——刚改密或解锁后,状态不会立刻刷新,有时需等下次认证才更新。