必须先用sys或system创建表空间,再建用户并授权;路径需预创建且oracle用户有写权限;临时表空间须专用;用户需显式指定默认/临时表空间及配额;密码含特殊字符须加双引号;权限应按最小原则授予。

直接上结论:创建表空间和用户必须用 SYS 或 SYSTEM 这类高权限账户登录,且顺序不能颠倒——先建表空间,再建用户,最后授权;否则会报 ORA-00959: tablespace 'XXX' does not exist 或 ORA-01918: user 'XXX' does not exist。
创建表空间时路径和权限最容易出错
Oracle 不会自动创建数据文件所在目录,如果指定路径如 '/u01/app/oracle/oradata/ORCL/myuser_data.dbf',但 Linux 下该目录不存在或 Oracle 进程(通常是 oracle 用户)无写权限,CREATE TABLESPACE 会直接失败,报错 ORA-01119: error in creating database file。
- 务必提前用操作系统命令确认路径存在且可写:
mkdir -p /u01/app/oracle/oradata/ORCL+chown oracle:oinstall /u01/app/oracle/oradata/ORCL - Windows 下注意反斜杠要双写或改用正斜杠:
'D:/oradata/ORCL/myuser_data.dbf',单反斜杠会被当作转义符处理 - 临时表空间必须用
CREATE TEMPORARY TABLESPACE,不能复用普通表空间;否则建用户时指定TEMPORARY TABLESPACE会报ORA-00959 -
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED是安全做法,避免后续插入数据时因空间不足中断
建用户时 default tablespace 和 quota 必须显式处理
很多新手只写 CREATE USER u1 IDENTIFIED BY p1;,结果用户能连上但无法建表,因为默认被分配到 USERS 表空间,而该表空间可能没给这个用户配额(QUOTA),导致 ORA-01950: no privileges on tablespace 'USERS'。
- 必须显式指定
DEFAULT TABLESPACE和TEMPORARY TABLESPACE,例如:create user appuser identified by "Sec@2026" default tablespace app_data temporary tablespace temp; - 对非
SYSTEM表空间,必须加QUOTA UNLIMITED ON app_data(或具体数值如QUOTA 100M ON app_data),否则建表立即失败 - 密码含特殊字符(如
@、/)必须用双引号包裹,否则 SQL*Plus 会误解析为连接命令
授予权限不能只靠 connect/resource
CONNECT 和 RESOURCE 是角色(role),不是权限本身。它们在 Oracle 12c+ 中已过时,且不包含 CREATE VIEW、CREATE SYNONYM 等常用操作权限。更关键的是:RESOURCE 角色默认不带 UNLIMITED TABLESPACE,所以即使指定了表空间,仍需单独授予。
- 最小可用组合是:
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE PROCEDURE TO appuser; - 若需建视图、同义词等,必须额外加:
GRANT CREATE VIEW, CREATE SYNONYM TO appuser; -
GRANT UNLIMITED TABLESPACE TO appuser;必须显式执行,否则哪怕有QUOTA UNLIMITED,某些 DDL 操作仍可能受限 - 不要轻易用
GRANT DBA TO appuser,这是生产环境红线;测试环境也建议用最小权限原则
真正容易被忽略的点是:表空间名、用户名、密码在 Oracle 中默认不区分大小写,但一旦用双引号定义(如 "MyUser"),就变成大小写敏感,后续所有引用都必须严格匹配——包括连接字符串里的用户名、SQL 中的 GRANT 对象名。这种隐式敏感性会在跨环境迁移或脚本复用时突然暴露问题。











