← 返回题目列表

Oracle 用户、角色和权限怎么设计?系统权限和对象权限有什么区别?

中等 第 24 / 32 题 更新于 2026/07/30
Oracle权限Role

简化版

Oracle 权限设计要区分用户、角色、系统权限和对象权限。系统权限控制“能不能做某类操作”,对象权限控制“能不能访问某个对象”。生产上不要给业务账号 DBA,应按最小权限给角色和对象授权。

详细版

用户是登录和对象归属主体;角色是一组权限集合,便于批量授权;系统权限如 CREATE SESSIONCREATE TABLE;对象权限如对某张表的 SELECTINSERT

常见授权示例:

GRANT CREATE SESSION TO app_user;
GRANT SELECT, INSERT ON order_owner.orders TO app_user;
GRANT report_role TO report_user;

面试要强调最小权限、职责分离、对象 owner 和应用访问账号分离。尤其要注意:存储过程、视图和 definer/invoker rights 会影响权限检查,不能只背 GRANT 语法。

完整版教学

一、为什么 Oracle 权限要分层理解

Oracle 里“能登录”“能建表”“能查某张表”不是一件事。把这些能力混在一起,很容易把业务账号授权过大。

例如应用只需要查询订单表,却被授予了 DBA,它就可能误删对象、修改系统参数或访问不该访问的数据。权限设计的第一原则是最小权限。

所以回答这题要先拆层:用户负责身份,角色负责权限集合,系统权限控制能力,对象权限控制具体对象。

二、系统权限和对象权限的区别

系统权限是数据库级能力,例如创建会话、创建表、创建过程。对象权限是针对某个 schema 对象的操作许可,例如查某张表或执行某个包。

系统权限:CREATE SESSION, CREATE TABLE, CREATE PROCEDURE
对象权限:SELECT ON hr.employees, EXECUTE ON pkg_order

这两个维度不能替代。给了 CREATE SESSION 只能登录,不代表能查业务表;给了表的 SELECT,如果不能登录也无法访问。

三、角色适合做权限集合

角色可以把一组权限打包,然后授给用户。比如报表角色包含若干只读权限,运维角色包含部分维护权限。

CREATE ROLE report_reader;
GRANT SELECT ON order_owner.orders TO report_reader;
GRANT SELECT ON order_owner.payments TO report_reader;
GRANT report_reader TO analyst_user;

如果有 20 个报表用户,角色能减少重复授权和漏授权。但角色不是越多越好,角色层级过深会让排查变困难。

四、对象 owner 和应用账号为什么要分开

一种常见设计是对象 owner 负责拥有表、索引、包;应用账号只被授予访问权限,不直接拥有核心对象。

这样应用账号被盗或误操作时,不容易直接 drop 自己拥有的对象。部署变更也可以由 owner 或专门发布账号执行。

账号类型作用权限特点
owner拥有对象DDL 权限强
app_user应用访问只给 DML/执行权限
report_user报表查询只读
dba_user运维管理严格审计

这种职责分离是生产权限设计的核心。

五、存储过程里的权限检查要注意

Oracle 存储过程有 definer rights 和 invoker rights 的差异。默认 definer rights 下,过程执行时使用定义者权限;invoker rights 则使用调用者权限。

这会影响安全边界。比如只给应用账号执行某个包的权限,而包内部由 owner 访问表,可以隐藏底层表结构并收敛访问入口。

但如果过程里拼动态 SQL,权限和注入风险又要额外控制。面试里补到这一点,会显得你知道 Oracle 权限不只是表级授权。

六、常见误区与追问

  • 误区:给业务账号 DBA 最省事。 这会扩大误操作和攻击面,生产应最小授权。
  • 误区:系统权限和对象权限是一回事。 系统权限控制能力,对象权限控制具体对象访问。
  • 误区:角色越多权限越清晰。 角色过多、嵌套过深会增加排查成本。
  • 追问:为什么 owner 和 app_user 要分开? 分离对象归属和应用访问,降低误删和越权风险。
  • 追问:存储过程执行时用谁的权限? 默认 definer rights,也可使用 invoker rights,需要按安全边界选择。

七、加强记忆

记忆钩子:Oracle 权限像公司门禁,用户是员工,角色是岗位,系统权限是能不能进机房,对象权限是能不能打开某个柜子。

回答这题按“用户、角色、系统权限、对象权限、最小权限、owner/app 分离、过程权限”来讲。不要停留在 GRANT SELECT,要讲出生产安全边界。