不是必须,但为确保Schema无法登录,必须组合使用PASSWORD EXPIRE与ACCOUNT LOCK;仅设其一不可靠,因EXPIRED状态仍允许登录改密,而LOCKED才能彻底禁止认证。
CREATE USER 时必须指定 PASSWORD EXPIRE 和 ACCOUNT LOCK 吗?
不是必须,但这是控制临时账号生命周期最直接的方式。oracle 不支持“自动过期删除用户”,只能靠密码过期 + 账户锁定组合实现“逻辑停用”。password expire 强制用户首次登录时改密,account lock 则直接禁止登录——两者配合才能避免账号被意外启用。
如何让账号在指定日期后无法登录?
Oracle 没有内置的 VALID UNTIL 语法(像 PostgreSQL 那样),只能靠外部机制或人工干预。实际可行的做法是:
- 创建用户时加
EXPIRY_DATE(需配合 profile):先建 profile 限制密码有效期,例如CREATE PROFILE temp_profile LIMIT PASSWORD_LIFE_TIME 7;,再用CREATE USER ... PROFILE temp_profile; - 手动设置密码过期时间:执行
ALTER USER username PASSWORD EXPIRE;后,该用户下次登录即被要求改密;若不改,则始终无法通过认证 - 到期前主动锁账户:用
ALTER USER username ACCOUNT LOCK;,比等密码过期更可控,也避免因用户提前登录触发改密流程
给第三方账号最小权限时容易漏掉什么?
第三方维护人员常被授予 CONNECT 和 RESOURCE,但这俩角色默认包含 CREATE TABLE、CREATE SEQUENCE 等高危权限。真正最小化应:
- 不用预定义角色,改用显式授权:只给
CREATE SESSION(登录必需),再按需加SELECT ANY DICTIONARY(查数据字典)、EXECUTE ON DBMS_LOCK(如需 sleep 控制)等 - 禁用无限表空间:明确限制配额,例如
QUOTA 10M ON users;,否则UNLIMITED TABLESPACE会让账号能写满整个表空间 - 不赋
CREATE ANY DIRECTORY,除非真要读写外部文件;若只需 expdp/impdp,用已存在的 directory 并单独授READ,WRITE ON DIRECTORY xxx
临时账号要不要配独立表空间?
要,而且必须配——否则新用户会落在 SYSTEM 或 USERS 这类共享表空间里,既难审计,又可能影响生产对象。正确做法是:
- 为第三方建专用小表空间,例如
CREATE TABLESPACE maint_202606 DATAFILE '/u01/oradata/ORCL/maint_202606.dbf' SIZE 50M; - 创建用户时绑定:
DEFAULT TABLESPACE maint_202606,并设QUOTA UNLIMITED ON maint_202606(仅限该空间) - 配套建临时表空间:
CREATE TEMPORARY TABLESPACE maint_temp TEMPFILE '/u01/oradata/ORCL/maint_temp.dbf' SIZE 20M;,避免挤占主临时空间
账号到期后,表空间可保留(清空内容即可),不必删——删表空间会中断其他会话,且重建成本高;真正要清理的,只是用户本身和其对象。











