oracle 19c新用户默认仅有create session权限,无任何ddl权限,故执行create table报ora-01031;需dba在目标pdb中显式授予create table等权限及表空间配额。
开发者账户默认不能执行任何 ddl 操作,必须显式授予 create table、create view 等系统权限,且不能靠角色间接继承(除非角色被显式启用)。
为什么刚创建的用户连 CREATE TABLE 都报 ORA-01031
Oracle 19c 默认只给新用户 CREATE SESSION 权限(登录权),其余所有 DDL 权限均为“零授予”。即使你给了 CONNECT 角色,在 12c+ 多租户环境下该角色已精简为仅含 CREATE SESSION,不再包含 CREATE TABLE 等旧版隐含权限。
常见错误现象:
-
ORA-01031: insufficient privileges—— 执行CREATE TABLE时直接报错 -
ORA-00942: table or view does not exist—— 实际是权限不足导致无法访问数据字典视图,而非真不存在
关键点:
- 权限必须由具备
GRANT ANY PRIVILEGE或 DBA 权限的用户(如SYS/SYSTEM)直接授予 - 在 CDB/PDB 架构下,若用户是本地用户(非
C##开头),必须先ALTER SESSION SET CONTAINER = pdb_name切换到对应 PDB 再授予权限 - 授予
CREATE TABLE后,用户仍需有表空间配额才能真正建表,否则报ORA-01950: no privileges on tablespace
授予开发者最小必要 DDL 权限的实操组合
按安全原则,只给开发所需、不给冗余权限。以下命令应在目标 PDB 中以 SYS AS SYSDBA 或具有 GRANT ANY PRIVILEGE 的用户执行:
- 基础可操作权限:
GRANT CREATE SESSION TO dev_user; - 建表与基本对象:
GRANT CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE PROCEDURE TO dev_user; - 表空间配额(必须!):
GRANT UNLIMITED TABLESPACE TO dev_user;或更严格地:ALTER USER dev_user QUOTA 100M ON users; - 如需修改自身对象(如
ALTER TABLE),额外加:GRANT ALTER ANY TABLE TO dev_user;(慎用,建议改用对象权限)
注意:
-
CREATE ANY TABLE是高危权限,允许建表到任意表空间,不应授予普通开发者 -
ALTER ANY TABLE和DROP ANY TABLE同理,属于 DBA 级权限,生产环境应禁用 - 如果使用角色(如自定义
dev_role),需确保该角色被SET ROLE显式启用,或用户登录时通过DEFAULT ROLE自动激活
验证权限是否生效的快速检查项
不要只信 GRANT 语句执行成功,要查数据字典确认当前会话实际拥有哪些权限:
- 查系统权限:
SELECT * FROM session_privs;—— 看CREATE TABLE是否在列表中 - 查角色是否启用:
SELECT * FROM session_roles;—— 若靠角色授予权限,此处必须出现对应角色名 - 查表空间配额:
SELECT tablespace_name, bytes/1024/1024 "MB" FROM user_ts_quotas;—— 确保非零值 - 测试建表:
CREATE TABLE t1 (id NUMBER);+DROP TABLE t1;—— 实际跑一遍最可靠
容易被忽略的一点:在多租户环境中,session_privs 只反映当前容器(PDB)内授予的权限,切错容器会导致查不到刚授的权。











