Oracle创建用户必须显式指定DEFAULT TABLESPACE和TEMPORARY TABLESPACE,二者缺一不可;用户建完默认锁定、无权限、需授权CREATE SESSION才能登录,并须配额或UNLIMITED TABLESPACE方可建表。
oracle 创建用户不能只写 create user username identified by password 就完事——漏掉 default tablespace 或 temporary tablespace,用户建出来也用不了,甚至直接报错。
CREATE USER 必须显式指定 DEFAULT TABLESPACE 和 TEMPORARY TABLESPACE
Oracle 不会继承数据库级默认表空间设置,CREATE USER 语句里这两个子句缺一不可。常见错误是复制脚本时删掉了 DEFAULT TABLESPACE users,结果在没有 users 表空间的库上执行失败,报 ORA-00959: tablespace 'users' does not exist。
-
DEFAULT TABLESPACE必须指向一个已存在、状态为ONLINE且READ WRITE的永久表空间;不能是SYSTEM(虽语法允许,但违反安全规范) -
TEMPORARY TABLESPACE也不能省略:不写会触发隐式继承,若数据库级DEFAULT_TEMP_TABLESPACE为空或无效,建用户直接失败 - 临时表空间不能设为
SYSTEM,ALTER USER ... TEMPORARY TABLESPACE system会被拒绝 - 生产环境建议按应用隔离临时表空间,例如
temp_app1,避免高并发排序争用
正确示例:
CREATE USER app_user IDENTIFIED BY "P@ssw0rd123" DEFAULT TABLESPACE app_data TEMPORARY TABLESPACE temp_app1 QUOTA 500M ON app_data;
用户创建后默认锁定、无权限、无法登录
新用户处于 LOCKED 状态,密码标记为 EXPIRED,且没有任何系统权限。哪怕你指定了表空间,不额外授权,连 sqlplus 都连不上。
- 必须先执行
GRANT CREATE SESSION TO app_user;才能建立连接 -
GRANT CONNECT, RESOURCE TO app_user;是常见快捷方式,但CONNECT角色仅含CREATE SESSION,RESOURCE含CREATE TABLE等,不含UNLIMITED TABLESPACE - 如果用户需要建表,又没给
UNLIMITED TABLESPACE,就得靠QUOTA控制:比如QUOTA 500M ON app_data,否则CREATE TABLE报ORA-01536: space quota exceeded - 别直接授
DBA角色,除非真要 DBA 权限;最小权限原则下,优先用自定义角色封装所需权限
QUOTA 0M 不等于禁止所有操作
QUOTA 0M ON app_data 常被误解为“禁用该用户”,其实它只限制创建段对象(表、索引、LOB 等),不影响已有对象的 DML 操作。
- 用户仍可
SELECT/INSERT/UPDATE/DELETE已存在的表(只要被授予对应对象权限) -
QUOTA UNLIMITED ON app_data风险高:应用逻辑缺陷导致无限插入时,可能瞬间撑爆表空间 - 配额可动态调整:
ALTER USER app_user QUOTA 1G ON app_data; - 查看当前配额:
SELECT tablespace_name, bytes/1024/1024 AS mb FROM dba_ts_quotas WHERE username = 'APP_USER';
权限查不到?注意 user_sys_privs 和 dba_sys_privs 的区别
用 SELECT * FROM user_sys_privs; 只能看到当前登录用户拥有的系统权限,不是目标用户的。想查别人,得用 dba_sys_privs(需 DBA 权限)。
-
user_sys_privs:当前会话用户视角 -
dba_sys_privs:DBA 查所有用户系统权限,WHERE grantee = 'APP_USER' -
user_tab_privs查当前用户被授予的对象权限;查别人用dba_tab_privs - 角色权限要查
dba_role_privs,比如确认app_user是否被授予了myrole
最容易忽略的是:用户创建后必须手动解锁、重置密码、显式授权,三步缺一不可;而 QUOTA 和 TEMPORARY TABLESPACE 这两个参数,一旦漏写或写错,问题往往不会立刻暴露,而是等到建表或排序时才崩。











