目标用户必须建在PDB中,执行SELECT SYS_CONTEXT('USERENV','CON_NAME') FROM DUAL确认非CDB$ROOT;建用户须显式指定DEFAULT TABLESPACE、TEMPORARY TABLESPACE及QUOTA;禁用RESOURCE角色,仅授予CREATE SESSION及必要DML权限;建完须用实际语句验证权限限制。

确认目标用户该建在哪个容器(CDB vs PDB)
12c 及以上版本必须先确认连接的是 PDB,否则 CREATE USER 会报 ORA-65096。执行:SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;
返回结果不是 CDB$ROOT 才能继续。如果连的是 CDB,得先 ALTER SESSION SET CONTAINER = your_pdb_name; 切过去。
建用户时禁用默认表空间陷阱
不显式指定 DEFAULT TABLESPACE,新用户会落到 SYSTEM 表空间——这是严重违规,不仅违反安全基线,还可能因误建对象拖垮核心表空间。必须明确指定业务专用表空间,例如:CREATE USER dev_user IDENTIFIED BY "P@ss4Dev" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 50M ON users ACCOUNT UNLOCK;
注意:QUOTA 必须设(哪怕很小),否则用户连 CREATE TABLE 都会报 ORA-01950(无表空间配额)。
只授 DML 权限:绕开 RESOURCE 角色这个坑
RESOURCE 是个“伪最小权限”角色,它自带 CREATE TABLECREATE SEQUENCE 等 DDL 权限,直接 GRANT RESOURCE TO dev_user; 就破功了。正确做法是只给必要系统权限:
-
GRANT CREATE SESSION TO dev_user;(登录必需) -
GRANT SELECT ANY TABLE TO dev_user;(如需跨 schema 查)或逐个GRANT SELECT ON schema.table TO dev_user; -
GRANT INSERT, UPDATE, DELETE ON schema.table TO dev_user;(按实际表授权)
别碰 CREATE PROCEDURECREATE VIEW 这类任何以 CREATE 开头的权限,也别给 UNLIMITED TABLESPACE——配额已由 QUOTA 控制。
验证权限是否真受限:用实际语句测试
建完立刻切到该用户下测试,最容易漏掉的是隐式依赖:
- 执行
SELECT * FROM dual;确认CREATE SESSION生效 - 执行
INSERT INTO your_table VALUES (...);测试 DML - 执行
CREATE TABLE t(x INT);—— 这条必须报ORA-01031: insufficient privileges - 执行
SELECT * FROM dba_tables;—— 应该报ORA-00942: table or view does not exist(没授SELECT ANY DICTIONARY)
特别注意:有些开发工具(如 PL/SQL Developer)会自动查数据字典表做元数据补全,如果没拦住,说明权限仍有松动。











