DB_DEVELOPER_ROLE包含约40+项系统权限,覆盖现代开发全链路:CREATE JOB、DEBUG CONNECT SESSION、CREATE MLE、EXECUTE DYNAMIC MLE、CREATE ANALYTIC VIEW、CREATE CUBE、CREATE MINING MODEL、CREATE TYPE、CREATE TRIGGER、CREATE MATERIALIZED VIEW、ON COMMIT REFRESH、FORCE TRANSACTION等,不包含DBA级权限,遵循最小权限原则。

DB_DEVELOPER_ROLE 是 Oracle 23c 起正式引入的、开箱即用的预定义角色,专为应用开发人员设计,能一次性替代过去需手动拼凑的 CONNECT + RESOURCE + 多个零散权限的组合方式。
DB_DEVELOPER_ROLE 包含哪些关键系统权限?
它不是简单叠加旧角色,而是整合了约 40+ 项系统权限,覆盖现代开发全链路。重点包括:
-
CREATE JOB、DEBUG CONNECT SESSION—— 不再需要单独GRANT调试和调度权限 -
CREATE MLE、EXECUTE DYNAMIC MLE—— 原生支持 JavaScript 存储过程(MLE 模块) -
CREATE ANALYTIC VIEW、CREATE CUBE、CREATE MINING MODEL—— 内置分析与 AI 场景能力 -
CREATE TYPE、CREATE TRIGGER、CREATE MATERIALIZED VIEW—— 完整对象建模能力 -
ON COMMIT REFRESH、FORCE TRANSACTION—— 支持高级事务控制
注意:DB_DEVELOPER_ROLE 不包含 DBA 级别权限(如 ALTER SYSTEM),也不自动授予对其他用户对象的访问权 —— 这是刻意设计的最小权限原则体现。
如何验证 DB_DEVELOPER_ROLE 实际授予了哪些权限?
直接查数据字典最可靠,避免依赖文档记忆:
- 查系统权限:
SELECT PRIVILEGE FROM ROLE_SYS_PRIVS WHERE ROLE = 'DB_DEVELOPER_ROLE'; - 查对象权限:
SELECT OWNER, TABLE_NAME, PRIVILEGE FROM ROLE_TAB_PRIVS WHERE ROLE = 'DB_DEVELOPER_ROLE'; - 查继承的子角色:
SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'DB_DEVELOPER_ROLE';(会看到它自动包含RESOURCE、SODA_APP、CTXAPP等)
执行这些查询前,确保你有 SELECT_CATALOG_ROLE 或更高权限(如 DBA),否则会提示无访问权限。
使用 DB_DEVELOPER_ROLE 时容易踩的坑
这个角色虽方便,但几个边界条件常被忽略:
- 它**不能在普通用户会话中直接授予自己**:必须由
SYS或具有GRANT ANY ROLE的管理员执行GRANT DB_DEVELOPER_ROLE TO dev_user; - 角色本身**不可修改**:你不能
GRANT新权限给DB_DEVELOPER_ROLE,也不能REVOKE其中某一项 —— 它是只读的 Oracle 预定义角色 - 在多租户环境(CDB/PDB)中,它默认只在当前容器生效;若要在 PDB 中使用,需先在该 PDB 内显式创建(Oracle 自动处理),但授权动作仍须在对应 PDB 内完成
- 它**不隐式授予 SELECT 权限到数据字典视图**:比如
V_$SESSION或DBA_TABLES,仍需额外GRANT SELECT ON SYS.V_$SESSION TO dev_user;或授SELECT_CATALOG_ROLE
真正麻烦的不是权限不够,而是权限“太够”却没意识到 —— 比如 CREATE MLE 允许加载任意 JavaScript 代码,一旦账号泄露,风险远高于传统 PL/SQL。


















