Oracle 用户、模式、权限、角色
Oracle 用户、模式、权限、角色
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 安全模型由四个核心概念构成[1]:
| 概念 | 作用 |
|---|---|
| 用户(User) | 数据库账户 |
| 模式(Schema) | 用户拥有的对象集合 |
| 权限(Privilege) | 执行特定操作的权利 |
| 角色(Role) | 权限集合 |
2. 用户(User)
2.1 创建用户
CREATE USER scott IDENTIFIED BY ******
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users
QUOTA 50M ON example_ts
PROFILE default
PASSWORD EXPIRE
ACCOUNT UNLOCK;
2.2 用户属性
SELECT
username,
default_tablespace,
temporary_tablespace,
account_status,
lock_date,
expiry_date,
default_tablespace,
profile
FROM dba_users
WHERE username='SCOTT';
2.3 修改用户
-- 修改密码
ALTER USER scott IDENTIFIED BY ******
-- 修改默认表空间
ALTER USER scott DEFAULT TABLESPACE users;
-- 锁定/解锁
ALTER USER scott ACCOUNT LOCK;
ALTER USER scott ACCOUNT UNLOCK;
-- 密码过期
ALTER USER scott PASSWORD EXPIRE;
-- 修改配额
ALTER USER scott QUOTA UNLIMITED ON users;
ALTER USER scott QUOTA 0 ON example_ts;
2.4 删除用户
-- 删除用户(无对象)
DROP USER scott;
-- 删除用户及其对象
DROP USER scott CASCADE;
3. 模式(Schema)
3.1 模式 = 用户
Oracle 中用户和模式一一对应,用户名即模式名[1]:
-- 查看模式
SELECT DISTINCT owner FROM dba_objects ORDER BY owner;
-- 查看模式对象
SELECT object_name, object_type
FROM dba_objects
WHERE owner='SCOTT';
3.2 模式对象
| 类型 | 示例 |
|---|---|
| TABLE | employees, departments |
| INDEX | idx_emp_name |
| VIEW | emp_view |
| SEQUENCE | emp_seq |
| SYNONYM | emp_syn |
| PROCEDURE | update_salary |
| FUNCTION | get_total |
| PACKAGE | employee_pkg |
| TRIGGER | emp_trigger |
| TYPE | employee_type |
| MATERIALIZED VIEW | emp_mv |
3.3 跨模式访问
-- 必须有对象权限
SELECT * FROM scott.employees;
-- 同义词简化
CREATE PUBLIC SYNONYM emp FOR scott.employees;
SELECT * FROM emp;
4. 权限(Privilege)
4.1 系统权限
-- 创建用户权限
GRANT CREATE USER TO admin;
-- 创建会话权限(必需)
GRANT CREATE SESSION TO scott;
-- 创建表权限
GRANT CREATE TABLE TO scott;
-- 创建任何表
GRANT CREATE ANY TABLE TO admin;
-- 删除任何表
GRANT DROP ANY TABLE TO admin;
-- 查询任何表
GRANT SELECT ANY TABLE TO admin;
-- unlimited tablespace
GRANT UNLIMITED TABLESPACE TO scott;
4.2 对象权限
-- 表权限
GRANT SELECT ON scott.employees TO hr_user;
GRANT INSERT, UPDATE ON scott.employees TO hr_user;
GRANT ALL ON scott.employees TO admin_user;
-- 列级权限
GRANT UPDATE (salary, dept_id) ON scott.employees TO hr_user;
-- 视图权限
GRANT SELECT ON scott.emp_view TO hr_user;
-- 存储过程权限
GRANT EXECUTE ON scott.update_salary TO hr_user;
4.3 撤销权限
-- 撤销系统权限
REVOKE CREATE TABLE FROM scott;
-- 撤销对象权限
REVOKE SELECT ON scott.employees FROM hr_user;
4.4 查看权限
-- 系统权限
SELECT * FROM dba_sys_privs WHERE grantee='SCOTT';
-- 对象权限
SELECT * FROM dba_tab_privs WHERE grantee='SCOTT';
-- 列权限
SELECT * FROM dba_col_privs WHERE grantee='SCOTT';
-- 用户授出的权限
SELECT * FROM dba_tab_privs WHERE grantor='SCOTT';
4.5 WITH ADMIN OPTION / WITH GRANT OPTION
-- WITH ADMIN OPTION:可转授系统权限
GRANT CREATE TABLE TO admin WITH ADMIN OPTION;
-- WITH GRANT OPTION:可转授对象权限
GRANT SELECT ON scott.employees TO admin WITH GRANT OPTION;
区别:
WITH ADMIN OPTION:撤销时不级联(被授者的转授权限保留)WITH GRANT OPTION:撤销时级联(被授者的转授权限也撤销)
5. 角色(Role)
5.1 概念
角色是权限的集合,简化权限管理[2]:
角色 → 权限1, 权限2, ...
↓
用户 → 角色 → 权限
5.2 预定义角色
| 角色 | 作用 |
|---|---|
| CONNECT | 创建会话 |
| RESOURCE | 创建对象(表、过程等) |
| DBA | 数据库管理员 |
| SYSDBA | 最高管理特权 |
| SYSOPER | 运维操作 |
| EXP_FULL_DATABASE | 导出全库 |
| IMP_FULL_DATABASE | 导入全库 |
| SELECT_CATALOG_ROLE | 查询数据字典 |
| EXECUTE_CATALOG_ROLE | 执行字典包 |
5.3 创建角色
-- 创建角色
CREATE ROLE app_role;
-- 创建密码保护角色
CREATE ROLE admin_role IDENTIFIED BY ******
-- 授予权限给角色
GRANT CREATE TABLE TO app_role;
GRANT SELECT, INSERT ON scott.employees TO app_role;
-- 授予角色给用户
GRANT app_role TO scott;
GRANT app_role TO hr_user;
5.4 角色管理
-- 启用/禁用角色
SET ROLE app_role;
SET ROLE ALL EXCEPT admin_role;
SET ROLE NONE; -- 禁用所有角色
-- 修改默认角色
ALTER USER scott DEFAULT ROLE app_role;
ALTER USER scott DEFAULT ROLE ALL;
ALTER USER scott DEFAULT ROLE ALL EXCEPT admin_role;
-- 删除角色
DROP ROLE app_role;
5.5 查看角色
-- 用户拥有的角色
SELECT * FROM dba_role_privs WHERE grantee='SCOTT';
-- 角色拥有的权限
SELECT * FROM role_sys_privs WHERE role='APP_ROLE';
-- 角色拥有的对象权限
SELECT * FROM role_tab_privs WHERE role='APP_ROLE';
-- 角色嵌套
SELECT * FROM role_role_privs WHERE role='APP_ROLE';
-- 当前会话启用的角色
SELECT * FROM session_roles;
6. 多租户(CDB/PDB)用户
6.1 Common User(公共用户)
-- 必须以 c## 开头
CREATE USER c##admin IDENTIFIED BY ******
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users
CONTAINER=ALL; -- 所有 PDB
-- 授予权限
GRANT CREATE SESSION TO c##admin CONTAINER=ALL;
6.2 Local User(本地用户)
-- 在 PDB 中创建
ALTER SESSION SET CONTAINER = salespdb;
CREATE USER sales_admin IDENTIFIED BY ******
DEFAULT TABLESPACE users;
GRANT CREATE SESSION TO sales_admin;
6.3 查询
-- CDB 视图
SELECT username, common, con_id FROM cdb_users;
-- PDB 视图
SELECT username FROM dba_users;
7. Profile(资源限制)
7.1 创建 Profile
CREATE PROFILE app_profile LIMIT
SESSIONS_PER_USER 5 -- 每用户最多 5 个会话
CPU_PER_SESSION 10000 -- 单会话最多 10000 厘秒 CPU
CPU_PER_CALL 1000 -- 单次调用最多 1000 厘秒
CONNECT_TIME 60 -- 单会话最长 60 分钟
IDLE_TIME 15 -- 空闲超时 15 分钟
LOGICAL_READS_PER_SESSION 100000 -- 单会话最多 100000 逻辑读
LOGICAL_READS_PER_CALL 10000 -- 单次调用最多 10000 逻辑读
FAILED_LOGIN_ATTEMPTS 5 -- 失败登录 5 次锁定
PASSWORD_LIFE_TIME 90 -- 密码 90 天过期
PASSWORD_REUSE_TIME 365 -- 365 天内不能复用
PASSWORD_REUSE_MAX 5 -- 修改 5 次后才能复用
PASSWORD_LOCK_TIME 1 -- 锁定 1 天
PASSWORD_GRACE_TIME 7 -- 过期后 7 天宽限
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;
7.2 分配 Profile
ALTER USER scott PROFILE app_profile;
7.3 启用资源限制
ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;
详细内容见:Oracle Profile 与资源限制。
8. 安全最佳实践
8.1 用户管理
- 最小权限原则:仅授必要权限
- 不用 SYS/SYSTEM 做日常:创建管理员
- 密码强度要求:复杂密码
- 定期修改密码:3-6 个月
- 锁定默认账户:SCOTT、HR 等
8.2 角色管理
- 业务用自定义角色:精细控制
- 避免 RESOURCE 角色:包含 UNLIMITED TABLESPACE
- 审计角色授予:DBA_ROLE_PRIVS
- 使用 Password Protected Role:敏感操作
8.3 权限审计
-- 审计权限授予
AUDIT GRANT ANY PRIVILEGE BY ACCESS;
AUDIT GRANT ANY OBJECT PRIVILEGE BY ACCESS;
AUDIT GRANT ANY ROLE BY ACCESS;
-- 查看审计
SELECT * FROM dba_audit_trail
WHERE action_name LIKE '%GRANT%'
ORDER BY timestamp DESC;
9. 常见坑与排错
9.1 ORA-01045: 缺少 CREATE SESSION
现象:用户无法登录。
修复:
GRANT CREATE SESSION TO scott;
9.2 ORA-01950: 表空间无配额
现象:用户无法创建对象。
修复:
ALTER USER scott QUOTA UNLIMITED ON users;
9.3 ORA-01031: 权限不足
现象:执行 DDL 失败。
修复:
-- 检查权限
SELECT * FROM dba_sys_privs WHERE grantee='SCOTT';
SELECT * FROM dba_role_privs WHERE grantee='SCOTT';
-- 授予权限
GRANT CREATE TABLE TO scott;
9.4 角色未启用
现象:用户有角色但权限不可用。
修复:
-- 检查默认角色
SELECT * FROM dba_role_privs WHERE grantee='SCOTT' AND default_role='YES';
-- 设置默认角色
ALTER USER scott DEFAULT ROLE app_role;
9.5 PDB 用户看不到 CDB 用户
原因:Common User 与 Local User 区分。
修复:
-- 在 CDB 根查看所有用户
SELECT username, common FROM cdb_users;
-- 在 PDB 查看 PDB 用户
ALTER SESSION SET CONTAINER = salespdb;
SELECT username FROM dba_users;
10. 最佳实践
- 最小权限原则:仅授必要权限
- 用角色管理权限:简化维护
- 创建管理员用户:不用 SYS 做日常
- 设置 Profile:限制资源
- 密码复杂度:使用 VERIFY_FUNCTION
- 定期审计:DBA_PRIVS / DBA_ROLES
- 多租户分级管理:Common / Local
- 锁定默认账户:SCOTT、HR
- 审计特权操作:SYSDBA 操作
- 使用统一审计(12c+):更精细
11. 参考资料
[1] Oracle Database Security Guide 19c, “Managing Security” https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/
[2] Oracle Database Administrator’s Guide 19c, “Administering User Accounts” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/administering-user-accounts-security.html