必须使用SYS或SYSTEM用户以AS SYSDBA登录才能创建用户和授权;CREATE USER需指定密码(区分大小写,含特殊字符须加双引号)、显式指定默认及临时表空间并设置配额;只读用户须逐个授予SELECT ON schema.table权限,不能依赖CONNECT角色或SELECT ANY TABLE。
必须用 sys 或 system 用户以 as sysdba 方式登录才能执行创建用户和授权操作,普通用户无权创建用户或授予系统权限。
CREATE USER 语句必须指定密码且注意特殊字符处理
Oracle 11g 密码默认区分大小写,且若含 !、@、$ 等特殊字符,不加双引号会导致 SQL 解析失败或报错 ORA-00922: missing or invalid option。
- 正确写法:
CREATE USER app_read IDENTIFIED BY "P@ssw0rd#2026"; - 错误写法:
CREATE USER app_read IDENTIFIED BY P@ssw0rd#2026;(未引号,被当作非法标识符) - 密码长度至少 8 字符,受
PASSWORD_VERIFY_FUNCTION策略影响;若策略启用,abc123类弱密码会被拒绝 - 不显式指定
DEFAULT TABLESPACE时,用户将继承数据库默认表空间(通常是USERS),但生产环境应显式指定
GRANT CONNECT 和 CREATE SESSION 是登录前提
只给 CONNECT 角色不够稳定——Oracle 11g 中 CONNECT 已被降级为仅含 CREATE SESSION,但部分老脚本仍依赖角色名。实际生效的是底层系统权限。
- 安全做法是直接授予权限:
GRANT CREATE SESSION TO app_read; - 避免只授
GRANT CONNECT TO app_read;,因该角色可能被管理员回收或修改定义 - 若用户需查其他用户下的对象(如视图),必须额外授予对象权限,
CREATE SESSION本身不提供任何查询能力
只读用户必须逐个 GRANT SELECT ON schema.table
Oracle 没有内置的“只读用户”角色,SELECT ANY TABLE 属高危权限,不应授予非 DBA 用户。真正可控的只读需基于对象授权。
- 单表授权:
GRANT SELECT ON hr.employees TO app_read; - 批量生成授权语句(在
SYS下运行):SELECT 'GRANT SELECT ON ' || owner || '.' || object_name || ' TO app_read;' FROM dba_objects WHERE owner = 'HR' AND object_type = 'TABLE';
- 注意:授权后,
app_read查询时必须写全限定名hr.employees,否则报ORA-00942: table or view does not exist - 如需省略 schema 名,得建同义词:
CREATE SYNONYM app_read.employees FOR hr.employees;,且需额外授CREATE SYNONYM权限
表空间配额和临时表空间容易被忽略
用户能登录、能查表,但一旦执行排序、分组或临时结果集较大的查询,就会因缺少临时表空间或数据表空间配额而报错 ORA-01536: space quota exceeded 或 ORA-01652: unable to extend temp segment。
- 必须显式分配默认表空间并设配额:
ALTER USER app_read QUOTA UNLIMITED ON users;(或限定为100M) - 必须指定临时表空间:
ALTER USER app_read TEMPORARY TABLESPACE temp;(不能依赖默认值,尤其 RAC 环境下) - 若目标表空间是新建的(如
tbs_app),需确保该表空间已存在且在线,否则CREATE USER会失败
真正卡住人的往往不是 CREATE USER 语法,而是配额没设、临时表空间没绑、或者 SELECT 权限没落到具体 schema 上——这三个点漏一个,用户就只能连上,不能查。


















