
Oracle 数据库 23ai 引入了一个全新的预定义角色 —— DB_DEVELOPER_ROLE
,这个角色的设计初衷是为了便捷地为数据库开发人员分配开发工作中常用的系统权限、对象权限和角色权限。Oracle 官方认为,开发人员在日常工作中,尤其是在构建 PL/SQL 程序、管理对象、处理作业任务以及使用新特性如 Machine Learning、Property Graph 等功能时,需要具备一定的系统能力。因此,他们整合了一系列常见权限并打包进这个专用角色中。
在 Oracle 23ai 版本发布之前,通常的做法是为开发人员授予 CONNECT
和 RESOURCE
两个角色来赋予最基本的开发权限。然而这两个角色的设计比较陈旧,尤其是 RESOURCE
的权限组合在不同版本中变化较大,且并不包含一些新特性的支持权限。
DB_DEVELOPER_ROLE
在 23ai 中的出现,相当于官方对“开发人员应该拥有哪些权限”的一次标准化定义。它不仅整合了 CONNECT
和 RESOURCE
的主要功能,而且增加了许多专为现代数据库开发设计的权限,其覆盖面和粒度都更贴近实际开发需求。
常规方式授予和撤销 DB_DEVELOPER_ROLE:
conn sys/SysPassword1@//localhost:1521/testpdb as sysdbagrant db_developer_role to testuser1;revoke db_developer_role from testuser1;
CONNECT、RESOURCE 和 DB_DEVELOPER_ROLE 权限对比分析:
为了方便理解,下面将对这三个角色分别进行权限分析,包括它们所拥有的系统权限、角色权限和对象权限。这样可以帮助我们更好地理解 DB_DEVELOPER_ROLE
所提供的能力,以及它与传统角色之间的区别。
CONNECT 角色
CONNECT
是 Oracle 数据库中最基础的预定义角色之一,主要用于允许用户建立数据库连接。在早期版本中,它还曾包含一些额外权限,但在最新版本中被简化为仅包含最小权限,主要用于连接数据库和容器切换。
以下是与 CONNECT
角色相关联的系统权限、角色权限和对象权限:
variable v_role VARCHAR2(30)exec :v_role := 'CONNECT';-- System Privilegesselect sp.privilegefrom dba_sys_privs spwhere sp.grantee = :v_roleorder by 1;PRIVILEGE----------------------------------------CREATE SESSIONSET CONTAINERSQL>-- Role Privilegesselect rp.granted_rolefrom dba_role_privs rpwhere rp.grantee = :v_roleorder by 1;no rows selectedSQL>-- Object Privilegescolumn privilege format a30column table_name format a30select tp.privilege, tp.table_namefrom dba_tab_privs tpwhere tp.grantee = :v_roleorder by 1, 2;no rows selectedSQL>
RESOURCE 角色
RESOURCE
是 Oracle 早期用于支持开发工作的经典角色,它允许用户创建各种数据库对象,如表、视图、序列、过程等。Oracle 23ai 对这个角色进行了扩展,相比 19c 增加了七项系统权限,使其更贴近现代开发需求。但它仍然不具备对一些现代功能(如 MLE、Graph、Cube 等)的访问能力。
以下是与 RESOURCE
角色相关联的权限:
variable v_role VARCHAR2(30)exec :v_role := 'RESOURCE';-- System Privilegesselect sp.privilegefrom dba_sys_privs spwhere sp.grantee = :v_roleorder by 1;PRIVILEGE----------------------------------------CREATE ANALYTIC VIEWCREATE ATTRIBUTE DIMENSIONCREATE CLUSTERCREATE HIERARCHYCREATE INDEXTYPECREATE MATERIALIZED VIEWCREATE OPERATORCREATE PROCEDURECREATE PROPERTY GRAPHCREATE SEQUENCECREATE SYNONYMCREATE TABLECREATE TRIGGERCREATE TYPECREATE VIEW15 rows selected.SQL>-- Role Privilegesselect rp.granted_rolefrom dba_role_privs rpwhere rp.grantee = :v_roleorder by 1;GRANTED_ROLE--------------------------------------------------------------------------------SODA_APPSQL>-- Object Privilegescolumn table_name format a30select tp.privilege, tp.table_namefrom dba_tab_privs tpwhere tp.grantee = :v_roleorder by 1, 2;no rows selectedSQL>
DB_DEVELOPER_ROLE 角色
DB_DEVELOPER_ROLE
是 Oracle 专门为数据库开发者定义的新角色,它不仅包括连接、创建对象的基本权限,还囊括了如创建多维数据集(CUBE)、机器学习模型、调度作业、动态执行 JavaScript(MLE)等高级功能的权限。此外,该角色还自动包含了 RESOURCE
角色以及其他扩展角色,例如 CTXAPP
。
以下是与 DB_DEVELOPER_ROLE
相关的权限列表:
variable v_role VARCHAR2(30)exec :v_role := 'DB_DEVELOPER_ROLE';-- System Privilegesselect sp.privilegefrom dba_sys_privs spwhere sp.grantee = :v_roleorder by 1;PRIVILEGE------------------------------CREATE CUBECREATE CUBE BUILD PROCESSCREATE CUBE DIMENSIONCREATE DIMENSIONCREATE DOMAINCREATE JOBCREATE MINING MODELCREATE MLECREATE SESSIONDEBUG CONNECT SESSIONEXECUTE DYNAMIC MLEFORCE TRANSACTIONON COMMIT REFRESH13 rows selected.SQL>-- Role Privilegesselect rp.granted_rolefrom dba_role_privs rpwhere rp.grantee = :v_roleorder by 1;GRANTED_ROLE--------------------------------------------------------------------------------CTXAPPRESOURCESQL>-- Object Privilegescolumn privilege format a30column table_name format a30select tp.privilege, tp.table_namefrom dba_tab_privs tpwhere tp.grantee = :v_roleorder by 1, 2;PRIVILEGE TABLE_NAME------------------------------ ------------------------------EXECUTE DBMS_REDACTEXECUTE DBMS_RLSEXECUTE DBMS_TSDP_MANAGEEXECUTE DBMS_TSDP_PROTECTEXECUTE JAVASCRIPTREAD V_$PARAMETERREAD V_$STATNAMESELECT DBA_PENDING_TRANSACTIONSSQL>
在长期的数据库使用实践中,Oracle 官方一直强调“最小权限原则(Least Privilege Principle)”,即建议用户仅被授予完成任务所必需的最少权限,以降低安全风险和误操作的可能性。
通过上述对比可以看出,DB_DEVELOPER_ROLE
所授予的权限远多于 CONNECT
和 RESOURCE
两个角色的总和。这意味着它功能更强,但也需要更高的权限管控意识。
对于一些对权限敏感的行业或单位(例如金融、电信、政务系统等),建议在启用该角色前进行评估:是否需要如此多的权限?是否所有开发人员都适合直接使用这个角色?是否应基于它自定义更细粒度的角色?
另外,RESOURCE
角色新增了更多权限,这意味着习惯性授予 CONNECT + RESOURCE
角色的用户,实际上已经接近于 DB_DEVELOPER_ROLE
所授予的权限级别。建议根据实际需求重新评估这两个角色的组合使用。




