新用户无法登录数据库的直接原因是未授予create session权限,且账户状态常为locked、密码expired;oracle默认不赋予任何权限,必须由sys/system等高权限用户显式执行grant create session to username才能登录。
新用户为什么连不上数据库?
因为 oracle 新建用户默认处于 locked 状态,密码标记为 expired,且没有任何系统权限。哪怕你执行了 create user app_user identified by "p@ssw0rd123",不额外授权,sqlplus app_user/p@ssw0rd123 也会报错 ora-01045: user app_user lacks create session privilege; logon denied。
最基础的登录能力来自 CREATE SESSION 权限——它不在任何默认角色里,必须显式授予。
CONNECT 和 RESOURCE 角色到底给了什么?
CONNECT 不是“能连上就行”的泛称,它只包含一个权限:CREATE SESSION。而 RESOURCE 是一组开发常用权限的集合,包括 CREATE TABLE、CREATE SEQUENCE、CREATE PROCEDURE 等,但它**不包含** UNLIMITED TABLESPACE。
- 没给
UNLIMITED TABLESPACE,又没设QUOTA,建表会直接报ORA-01536: space quota exceeded -
GRANT CONNECT, RESOURCE TO app_user是常见快捷方式,但仅适用于开发测试环境;生产环境应避免直接授RESOURCE,改用自定义角色封装最小必要权限 -
DBA角色含 180+ 个系统权限,除非真要管理数据库,否则绝不推荐
如何让新用户“默认”拥有基础权限?
Oracle 没有全局开关能让所有新用户自动获得某组权限。所谓“默认”,只能靠两种可控方式实现:
- 在
CREATE USER后立刻执行GRANT(脚本化或自动化部署中必须写死) - 创建自定义角色(如
app_developer),把CREATE SESSION、CREATE TABLE、QUOTA 100M ON app_data等打包进去,再GRANT app_developer TO app_user - 注意:
DEFAULT ROLE只影响角色是否自动激活,不解决权限缺失问题;即使指定了DEFAULT ROLE app_developer,也得先GRANT app_developer TO app_user
QUOTA 0M 是不是等于禁用用户?
不是。QUOTA 0M ON app_data 只禁止用户在该表空间新建段对象(表、索引、LOB 等),但已有对象的 SELECT、INSERT、UPDATE 等 DML 操作完全不受影响。这点常被误读,导致权限过度收紧。
真正限制登录的是缺少 CREATE SESSION;真正限制建表的是缺 CREATE TABLE 或表空间配额不足;而 QUOTA 0M 只堵住新建对象这一条路。











