新用户需先授 create session 才能登录,否则报 ora-01045;resource 角色含建表等权限但不含 unlimited tablespace 和 select any table,须额外配额及授权;授权前须确认用户存在、当前用户有相应权限(如 grant any privilege 或带 admin option 的权限)及容器上下文正确(cdb$root 中授全局用户需加 container=all,本地用户仅限所在 pdb)。
直接给新用户授 create session 和 resource 权限是可行的,但必须确认用户已存在、当前会话有足够权限,且目标容器(cdb/pdb)上下文正确——否则会报 ora-01917: user or role 'xxx' does not exist 或 ora-01031: insufficient privileges。
CREATE SESSION 是登录数据库的最低门槛
没有这个权限,用户连 sqlplus username/password@tns 都会失败,报错 ORA-01045: user XXX lacks CREATE SESSION privilege; logon denied。它不依赖任何表空间或对象,纯系统级许可。
- 必须由具有
GRANT ANY PRIVILEGE或被显式授予CREATE SESSION并带ADMIN OPTION的用户执行 - 在 CDB$ROOT 中对全局用户(
c##xxx)授权时,默认只作用于当前容器;加CONTAINER = ALL才能同步到所有打开的 PDB - 本地用户(如
scott)只能在所在 PDB 内授权,CONTAINER子句无效
RESOURCE 角色 ≠ 无限建表权
RESOURCE 是预定义角色,包含 CREATE TABLE、CREATE SEQUENCE、CREATE PROCEDURE 等,但它不包含 UNLIMITED TABLESPACE —— 这意味着即使授了 RESOURCE,用户仍可能因表空间配额不足而建表失败,报 ORA-01950: no privileges on tablespace 'USERS'。
- 常见补救方式:执行
ALTER USER username QUOTA UNLIMITED ON users(或指定具体表空间) - Oracle 19c 中,
RESOURCE仍不含CREATE VIEW或CREATE SYNONYM,这些属于CONNECT角色;若需视图能力,得额外授CREATE VIEW或合并角色 - 注意:
RESOURCE在 19c 中依然不包含SELECT ANY TABLE,跨 schema 查询必须单独授权
GRANT 语句执行前必须检查三件事
很多“授权失败”其实和 GRANT 语法无关,而是环境前提没满足。
- 确认用户已创建且未被锁:查
SELECT username, account_status FROM dba_users WHERE username = 'XXX',状态应为OPEN - 确认当前连接用户有授权资格:用
SELECT * FROM session_privs看是否含GRANT ANY PRIVILEGE,或查SELECT * FROM user_sys_privs是否有带ADMIN OPTION的目标权限 - 确认容器上下文:在 CDB$ROOT 中操作全局用户,用
SHOW CON_NAME;若在 PDB 中,CREATE USER默认建本地用户,GRANT也只对该 PDB 有效
最易被忽略的是表空间配额和容器范围——GRANT RESOURCE TO usr 看似成功,但用户一建表就卡住,往往是因为忘了 QUOTA 或误在 CDB$ROOT 给本地用户授权(根本找不到该用户)。动手前先跑两行验证查询,比反复试错快得多。











