知识库✳

教程与手册

全部教程
  1. 01Oracle 函数手册
  2. 02性能优化手册
  3. 03Linux Shell
  4. 04Oracle 学习与演练
  5. 05网络基础学习
  6. 06数据治理与管理
返回个人网站
甲Oracle 学习教程从 SQL 到 PL/SQL 与运维
首页课程目录搜索演练场
知识库

已完成 0 / 22 章

模块一 · 入门与准备

  • 01Oracle 数据库体系结构
  • 02环境安装与连接方式
  • 03SQL*Plus 与常用工具

模块二 · SQL 查询基础

  • 04SELECT 查询基础
  • 05过滤与排序
  • 06单行函数
  • 07多表连接
  • 08分组聚合与 HAVING
  • 09子查询

模块三 · 数据与对象

  • 10DML 与事务控制
  • 11表与数据类型
  • 12约束
  • 13索引与执行计划
  • 14视图、序列与同义词

模块四 · PL/SQL 编程

  • 15PL/SQL 块与变量
  • 16流程控制与游标
  • 17存储过程与函数
  • 18触发器
  • 19异常处理

模块五 · 运维与进阶

  • 20用户与权限管理
  • 21表空间与存储管理
  • 22备份与恢复
❖

Oracle 学习教程

返回个人网站知识库

示例代码基于 Oracle AI Database 26ai / 23ai,查询示例使用官方 HR 示例方案。

以 Next.js 16 · Tailwind CSS v4 · HeroUI v3 装帧

20
  1. 首页
  2. 课程目录
  3. 用户与权限管理

第 20 章◆高级◆建议 45 分钟◆模块五 · 运维与进阶

用户与权限管理

创建用户、授予权限、用角色管理批量授权,并遵循最小权限原则。

学完这一章,你应该能

  • 会创建用户并指定默认表空间与配额
  • 分清系统权限与对象权限
  • 会用角色简化授权管理
  • 能查询谁拥有什么权限

20.1创建用户

标准建用户流程
-- 在 PDB 中操作
ALTER SESSION SET CONTAINER = FREEPDB1;

CREATE USER app_user
  IDENTIFIED BY "App#2024Pwd"          -- 11g 起口令默认区分大小写
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA 500M ON users                  -- 允许在该表空间用 500MB
  PROFILE DEFAULT
  ACCOUNT UNLOCK;

-- 授予基本登录权限
GRANT CREATE SESSION TO app_user;
-- 允许建表
GRANT CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE TO app_user;

这一节的操作(CREATE USER / GRANT / ALTER USER)都需要以 DBA 身份执行,例如用 SYSTEM 或 SYSDBA 连接;普通用户跑会报 ORA-01031: insufficient privileges。

只作示例阅读:切换容器(需 SYSDBA)。请在独立学习数据库中练习。

提示 口令用双引号包起来可以包含特殊字符,但也意味着必须严格按大小写输入。生产环境不要用简单口令,Oracle 默认的 PROFILE 会校验复杂度。

20.2系统权限与对象权限

  • 系统权限数量很多,ANY 结尾的权限(如 SELECT ANY TABLE)非常危险,慎授
  • 对象权限针对具体表/视图/过程,粒度更细
  • WITH GRANT OPTION 会形成权限传播链,回收时要留意级联效应
两类权限的差别
-- app_user 在上一节已经建好,这里再补一个审计账号
CREATE USER audit_user IDENTIFIED BY "Audit#2024Pwd";

-- 系统权限:在数据库中「做什么」
GRANT CREATE SESSION, CREATE TABLE TO app_user;
GRANT SELECT ANY TABLE TO audit_user;      -- 谨慎授予

-- 对象权限:对「某个具体对象」做什么
GRANT SELECT, INSERT, UPDATE ON hr.employees TO app_user;
GRANT SELECT ON hr.departments TO app_user;

-- 允许把权限再转授给别人
GRANT SELECT ON hr.employees TO app_user WITH GRANT OPTION;

-- 收回权限
REVOKE SELECT ON hr.employees FROM app_user;

只作示例阅读:建/改用户、角色、表空间。请在独立学习数据库中练习。

20.3角色:批量授权的正确方式

  • Oracle 预置三个重要角色:CONNECT(基本连接)、RESOURCE(建对象)、DBA(全部权限)
  • 生产环境不要直接给 DBA,应该按职责定义细粒度角色
  • 角色默认是 DEFAULT ROLE,禁用后需要显式 SET ROLE 才生效
自定义角色
-- 建角色
CREATE ROLE role_readonly;
CREATE ROLE role_developer;

-- 给角色授权
GRANT CREATE SESSION TO role_readonly;
GRANT SELECT ON hr.employees   TO role_readonly;
GRANT SELECT ON hr.departments TO role_readonly;

GRANT role_readonly TO role_developer;
GRANT CREATE TABLE, CREATE VIEW TO role_developer;

-- 把角色分配给用户
GRANT role_readonly  TO audit_user;
GRANT role_developer TO app_user;

-- 查看用户拥有的角色
SELECT granted_role, admin_option, default_role
FROM   dba_role_privs WHERE grantee = 'APP_USER';

只作示例阅读:建/改用户、角色、表空间。请在独立学习数据库中练习。

20.4权限查询与审计

常用权限查询视图
-- 当前用户被授予的系统权限
SELECT privilege FROM user_sys_privs ORDER BY privilege;

-- 当前用户对别人对象的权限
SELECT owner, table_name, privilege
FROM   user_tab_privs
ORDER  BY owner, table_name;

-- DBA 视角:查所有用户
SELECT username, account_status, default_tablespace, created
FROM   dba_users
ORDER  BY created DESC;

-- 解锁与改口令
ALTER USER app_user ACCOUNT UNLOCK;
ALTER USER app_user IDENTIFIED BY "NewPwd#2024";

只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。

练习

3 题 · 先自己写,再展开对照

参考答案

系统权限:在数据库里能做什么动作,作用于整个数据库。
  例:CREATE SESSION(允许登录)、CREATE TABLE、SELECT ANY TABLE。

对象权限:对某个具体对象能做什么,粒度更细。
  例:SELECT ON hr.employees、UPDATE ON hr.departments。

实践提醒:ANY 结尾的系统权限(如 SELECT ANY TABLE)等于能读所有用户
的数据,非常危险,只在极少数运维场景才授予。

自评要点

  • 系统权限作用于数据库级动作,对象权限针对具体对象
  • 意识到 ANY 类权限的风险

参考答案

违反最小权限原则。应用一旦被注入或配置出错,攻击者或错误代码
就能以 DBA 身份操作整个数据库(删库、改任意用户口令、绕过审计)。

正确做法是按职责定义细粒度角色:
CREATE ROLE role_app;
GRANT CREATE SESSION TO role_app;
GRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.orders TO role_app;
-- ...
GRANT role_app TO app_user;

好处:权限可审计(dba_role_privs)、可批量调整、离职或换环境时好回收。
另外要注意:应用账号不应该拥有对象属主权限,建表等 DDL
应交由部署流程用专门账号执行。

自评要点

  • 最小权限原则
  • 用自定义角色而非 DBA
  • 应用账号不需要 DDL 权限

参考答案

-- 系统权限
SELECT privilege FROM user_sys_privs ORDER BY privilege;

-- 角色
SELECT granted_role, admin_option, default_role
FROM   user_role_privs;

-- 我能对别人的对象做什么(对象权限)
SELECT owner, table_name, privilege FROM user_tab_privs;
在你的专用沙箱里执行打开演练场

自评要点

  • user_sys_privs / user_role_privs / user_tab_privs 三个视图
  • 知道 user_ 前缀是当前用户,dba_ 需要 DBA 权限
← 上一章

异常处理

下一章 →

表空间与存储管理