一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

怎样查看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 本身已包含 createdaccount_status 字段。前提是当前用户有 select any dictionarydba 角色权限——没权限时会报 ora-00942: table or view does not exist

最简命令就是:

SELECT username, account_status, created FROM dba_users;

常见错误是漏掉 ORDER BY created,导致新老用户混在一起难定位;也有人误用 ALL_USERS,但它不带 ACCOUNT_STATUSCREATED(只含 USERNAMEUSER_IDCREATED),字段不全。

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 是单字段枚举值,常见值包括 OPENLOCKEDEXPIREDEXPIRED & LOCKEDEXPIRED(GRACE) 等。它不拆分成“是否过期”和“是否锁定”两个布尔值。

这意味着:

  • 不能靠 WHERE account_status = 'EXPIRED' 漏掉 EXPIRED & LOCKED 用户
  • 真要筛所有异常状态,得用 WHERE account_status NOT IN ('OPEN', 'EXPIRED(GRACE)')
  • LOCK_DATEEXPIRY_DATE 字段可能为空,但 ACCOUNT_STATUS 才是唯一权威状态标识

真正容易被忽略的是:ACCOUNT_STATUS 的值依赖密码策略(PROFILE)和用户上次登录行为,不是静态快照——刚改密或解锁后,状态不会立刻刷新,有时需等下次认证才更新。

热门栏目