Oracle 19c 默认永久表空间为 SYSTEM,存在性能与管理风险;应通过 SELECT ... DEFAULT_PERMANENT_TABLESPACE 确认,并用 ALTER DATABASE DEFAULT TABLESPACE users 修改为非SYSTEM表空间,且需配合用户级 QUOTA 才生效。
查清当前数据库默认永久表空间
执行 select property_name, property_value from database_properties where property_name = 'default_permanent_tablespace'; 就能立刻看到当前生效的默认表空间名。oracle 19c 安装后默认是 system,这非常危险——新用户不显式指定表空间时,所有对象会直接写进系统表空间,导致性能下降、管理混乱甚至被 oracle 拒绝(ora-00922 报错就可能源于此)。务必先确认,别凭经验猜。
用 ALTER DATABASE 修改全局默认永久表空间
这不是给某个用户设的,而是影响所有后续 CREATE USER 语句中未带 DEFAULT TABLESPACE 子句的行为。操作必须用 SYS 或 SYSTEM 登录:
- 确保目标表空间已存在、在线、且非
SYSTEM/SYSAUX(ALTER DATABASE DEFAULT TABLESPACE system;必报错) - 执行
ALTER DATABASE DEFAULT TABLESPACE users;(假设USERS已就绪) - 改完立即查
database_properties确认值已更新,别信“应该改好了” - 注意:该操作不影响任何已有用户或对象,只管“将来新创建的用户没指定表空间时往哪放”
创建用户时必须显式指定 DEFAULT TABLESPACE
即使改了数据库级默认,也强烈建议在 CREATE USER 里写死 DEFAULT TABLESPACE 和 TEMPORARY TABLESPACE。原因很实在:
- 避免依赖全局配置,提升脚本可移植性(比如从测试库迁到生产库时,
DEFAULT_PERMANENT_TABLESPACE可能不同) - 防止 DBA 忘记改全局设置,导致新用户意外落到
SYSTEM - 语法必须严格:
CREATE USER app_user IDENTIFIED BY pwd DEFAULT TABLESPACE data TEMPORARY TABLESPACE temp;——漏掉DEFAULT TABLESPACE关键字,或写成SET DEFAULT TABLESPACE,都会触发ORA-00922 - 表空间名不要加引号,除非建它时用了双引号且含大小写(比如
"Data"),否则"DATA"会报ORA-01536或ORA-00959
用户级 DEFAULT TABLESPACE 和 QUOTA 必须配对生效
只执行 ALTER USER app_user DEFAULT TABLESPACE data; 不够,用户还得能在该表空间里存数据:
- 检查用户是否已有配额:
SELECT tablespace_name, bytes/1024/1024 AS mb FROM dba_ts_quotas WHERE username = 'APP_USER' AND tablespace_name = 'DATA'; - 没结果?说明没配额,下一步必报
ORA-01536。补上:ALTER USER app_user QUOTA UNLIMITED ON data;(或限定具体大小) - 注意:QUOTA 是针对表空间的独立授权,和
UNLIMITED TABLESPACE系统权限不是一回事;后者太宽泛,不推荐日常使用 - 改完默认表空间,老表不会自动搬过去——
SELECT table_name, tablespace_name FROM user_tables;能清楚看到哪些还在旧地方
DEFAULT TABLESPACE 属性 + 对应表空间上的 QUOTA。这两层缺一不可,漏查任一环节,新建表就会失败,而且错误提示往往不直接指向根源。


















