必须先查SELECT property_name, property_value FROM database_properties WHERE property_name = 'DEFAULT_PERMANENT_TABLESPACE'确认当前值,Oracle 19c默认为SYSTEM,属危险出厂设置,需用ALTER DATABASE DEFAULT TABLESPACE users(SYS/SYSTEM执行)修改为非SYSTEM表空间,并确保其ONLINE;该操作仅影响后续未显式指定表空间的新用户,不改变已有对象。
确认当前数据库默认永久表空间
别跳过这步,直接执行:select property_name, property_value from database_properties where property_name = 'default_permanent_tablespace';。oracle 19c 安装后默认值是 system,这不是配置错误,而是危险的出厂设置——新用户不显式指定表空间时,所有表、索引都会往 system 里写,很快触发 ora-01653 或直接拖慢整个库。
用 ALTER DATABASE 修改全局默认永久表空间
这是治本操作,影响所有后续未指定 DEFAULT TABLESPACE 的 CREATE USER 语句:
- 必须用
SYS或SYSTEM登录执行 - 目标表空间(如
USERS、DATA)必须已存在、状态为ONLINE,且不能是SYSTEM或SYSAUX(否则报ORA-00922) - 执行
ALTER DATABASE DEFAULT TABLESPACE users;后,立刻查database_properties确认值已更新 - 该操作不影响已有用户或对象,只约束“将来”
创建用户时仍要显式指定 DEFAULT TABLESPACE
即使改了全局默认,也必须在 CREATE USER 里写死:CREATE USER app_user IDENTIFIED BY pwd DEFAULT TABLESPACE data TEMPORARY TABLESPACE temp;
- 漏掉
DEFAULT TABLESPACE关键字 → 报ORA-00922 - 写成
SET DEFAULT TABLESPACE→ 多了SET,同样ORA-00922 - 表空间名加单引号(
'data')或双引号("DATA")→ 若建表空间时没用双引号定义大小写,就报ORA-00959 - 临时表空间也建议显式指定,避免意外落到
TEMP(可能被其他用户挤占)
用户级 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;(或限定具体大小,如1G) -
QUOTA和UNLIMITED TABLESPACE权限不是一回事:前者是表空间级空间授权,后者是系统权限,两者互不替代
改完默认表空间,老表不会自动迁移——SELECT table_name, tablespace_name FROM user_tables; 能验证这点。想挪现有对象,得单独执行 ALTER TABLE xxx MOVE TABLESPACE data;,且迁移前确保目标表空间有空间、用户有配额。


















