ALTER DATABASE DEFAULT TABLESPACE 未生效是因为它仅设新用户的初始默认表空间,不改变已有用户设置,也不强制运行时对象创建行为;真正起作用的是各用户自身的 DEFAULT TABLESPACE 属性,且需配合相应表空间配额。
ALTER DATABASE DEFAULT TABLESPACE 为什么没生效
执行 alter database default tablespace users 后,新用户建表仍落到 system 或旧表空间,通常是因为该语句只影响「后续创建的用户」,不改变已有用户的默认表空间。更关键的是:它不控制用户创建对象时实际使用的表空间——真正起作用的是用户自身的 default tablespace 属性。
- 数据库级默认表空间(
ALTER DATABASE DEFAULT TABLESPACE)仅作为新用户创建时的“初始值”,不是运行时强制策略 - 每个用户在
CREATE USER时被赋予一个独立的DEFAULT TABLESPACE,之后必须显式用ALTER USER ... DEFAULT TABLESPACE修改 - 如果用户有
UNLIMITED TABLESPACE权限,且未指定表空间,Oracle 可能回退到SYSTEM(尤其在 11g 及更早版本)
如何批量修正已有用户的默认表空间
不能靠改数据库级别设置来“批量修复”,必须逐个更新用户。常见误操作是写循环但漏掉 SYSDATE 或权限校验,导致部分用户失败静默跳过。
- 先查出需要调整的用户:
SELECT username FROM dba_users WHERE default_tablespace NOT IN ('USERS', 'DATA') AND username NOT IN ('SYS','SYSTEM','OUTLN') - 生成修改语句(注意引号嵌套):
SELECT 'ALTER USER ' || username || ' DEFAULT TABLESPACE users;' FROM dba_users WHERE ... - 执行前确认目标表空间已存在且在线:
SELECT status FROM dba_tablespaces WHERE tablespace_name = 'USERS',状态必须为ONLINE - 若用户正在连接,修改后其当前会话仍使用旧表空间,新建对象才生效;无需重启实例
CREATE USER 时不指定 DEFAULT TABLESPACE 的后果
省略 DEFAULT TABLESPACE 子句时,Oracle 会取数据库级默认值——但这个值可能早已被重置为 SYSTEM(比如初始化后未手动改过),结果就是新用户一建就埋下隐患。
- 初始化数据库时,
DEFAULT TABLESPACE默认是SYSTEM;DBCA 创建库时若未选自定义表空间,也会保留此行为 -
CREATE USER u IDENTIFIED BY p;等价于CREATE USER u IDENTIFIED BY p DEFAULT TABLESPACE SYSTEM; - 即使数据库级设了
USERS,只要建用户时没显式写DEFAULT TABLESPACE,Oracle 仍可能忽略它(取决于版本和补丁) - 安全做法:所有
CREATE USER必须带DEFAULT TABLESPACE和TEMPORARY TABLESPACE
表空间名大小写与引号陷阱
Oracle 表空间名默认大写、不区分大小写,但一旦用双引号创建(如 "MyTableSpace"),后续所有引用都必须严格匹配大小写和引号,否则报 ORA-00959: tablespace does not exist。
-
ALTER DATABASE DEFAULT TABLESPACE mytablespace→ 实际找的是MYTABLESPACE -
ALTER DATABASE DEFAULT TABLESPACE "mytablespace"→ 找的是字面量mytablespace(小写),大概率失败 - 检查真实名称用:
SELECT tablespace_name FROM dba_tablespaces,看输出是否带双引号 - 生产环境强烈建议全用大写、不用引号,避免脚本迁移或复制粘贴时出错
DEFAULT TABLESPACE,还得确保用户在那个表空间上有 QUOTA,否则建表直接报 ORA-01950: no privileges on tablespace。

















