CREATE USER必须显式指定DEFAULT TABLESPACE和TEMPORARY TABLESPACE,且表空间须存在、ONLINE、READ WRITE;QUOTA控制建对象权限,0M禁止创建段但允许查询插入;用户默认锁定且密码过期,需额外授权CREATE SESSION才能登录。
CREATE USER 语句必须显式指定 DEFAULT TABLESPACE
oracle 不会为新用户自动分配默认表空间,哪怕数据库有 default tablespace 设置。漏写这一项,create user 会直接报错:ora-00959: tablespace 'users' does not exist(如果系统里真没 users 表空间),或者更隐蔽地创建失败——因为用户被赋予了不存在或不可写的表空间。
- 必须用
DEFAULT TABLESPACE明确指定一个**已存在且 ONLINE、READ WRITE** 的表空间 - 常见误操作:复制别人脚本时删掉了
DEFAULT TABLESPACE users,结果在没有users表空间的库上执行失败 - 不推荐依赖
ALTER DATABASE DEFAULT TABLESPACE ...全局设置——它只影响后续未显式指定的CREATE USER,且容易被忽略或遗忘 - 示例正确写法:
CREATE USER app_user IDENTIFIED BY "P@ssw0rd123" DEFAULT TABLESPACE app_data TEMPORARY TABLESPACE temp QUOTA 100M ON app_data;
TEMPORARY TABLESPACE 不能省略,但可以复用 SYSTEM 外的任何临时表空间
Oracle 要求每个用户必须关联一个临时表空间,用于排序、哈希连接等操作。虽然语法上 TEMPORARY TABLESPACE 看似可选,但实际不写会触发隐式继承规则,极易踩坑。
- 若省略该子句,Oracle 会尝试使用数据库级默认临时表空间(
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE');如果该值为空或指向无效表空间,建用户会失败 - 禁止将
SYSTEM表空间设为临时表空间(ALTER USER ... TEMPORARY TABLESPACE system会被拒绝) - 生产环境应避免所有用户共用同一个临时表空间(如
temp),高并发排序可能引发争用;建议按应用分组分配,例如temp_app1、temp_app2
QUOTA ON 表空间决定用户能否建对象,0M ≠ 禁止写入
QUOTA 控制用户在指定表空间中能占用多少数据段空间。它和“能否登录”“能否执行 SQL”无关,但直接决定 CREATE TABLE 是否成功。
-
QUOTA 0M ON app_data表示不允许在app_data中创建任何段(表、索引等),但用户仍可查询、插入(只要目标表存在且有权限) -
QUOTA UNLIMITED ON app_data风险高:一旦应用逻辑缺陷导致无限插入,可能撑爆表空间 - 更安全的做法是预估用量后设合理上限,例如
QUOTA 500M ON app_data,后续可按需用ALTER USER ... QUOTA 1G ON app_data扩容 - 注意:如果用户需要在多个表空间建对象,必须对每个表空间单独授权配额,例如再加一句
QUOTA 50M ON app_idx
密码策略与账户状态常被忽略,但直接影响首次连接
用户创建后默认是锁定状态(ACCOUNT_STATUS = 'EXPIRED(GRACE)' 或 'LOCKED'),且 Oracle 12c+ 默认启用密码复杂度校验。这两点让很多“语法没错”的脚本连不上库。
- 密码必须满足当前
PASSWORD_VERIFY_FUNCTION规则(比如含大小写字母+数字+特殊字符),否则报ORA-28003: password verification for the specified password failed - 新建用户默认密码过期,首次连接会强制要求改密;如不想交互式改密,建用户时加
PASSWORD EXPIRE后立即ALTER USER ... IDENTIFIED BY ... REPLACE ...,或直接用ALTER USER ... ACCOUNT UNLOCK - Oracle 12c 及以后版本,
CREATE USER必须搭配GRANT CREATE SESSION TO ...才能登录——建用户本身不带任何权限
Oracle 用户创建最常卡在「表空间不存在」「临时表空间未指定」「配额为 0 却想建表」「密码不合规却没看到报错信息」这四点。检查时优先确认 DBA_TABLESPACES 和 DBA_TEMP_FILES 视图里的实际名称,别凭记忆写 users 或 temp。










