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 sysdba
grant 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 Privileges
select sp.privilege
from dba_sys_privs sp
where sp.grantee = :v_role
order by 1;
PRIVILEGE
----------------------------------------
CREATE SESSION
SET CONTAINER
SQL>
-- Role Privileges
select rp.granted_role
from dba_role_privs rp
where rp.grantee = :v_role
order by 1;
no rows selected
SQL>
-- Object Privileges
column privilege format a30
column table_name format a30
select tp.privilege, tp.table_name
from dba_tab_privs tp
where tp.grantee = :v_role
order by 1, 2;
no rows selected
SQL>
复制
RESOURCE 角色
RESOURCE
是 Oracle 早期用于支持开发工作的经典角色,它允许用户创建各种数据库对象,如表、视图、序列、过程等。Oracle 23ai 对这个角色进行了扩展,相比 19c 增加了七项系统权限,使其更贴近现代开发需求。但它仍然不具备对一些现代功能(如 MLE、Graph、Cube 等)的访问能力。
以下是与 RESOURCE
角色相关联的权限:
variable v_role VARCHAR2(30)
exec :v_role := 'RESOURCE';
-- System Privileges
select sp.privilege
from dba_sys_privs sp
where sp.grantee = :v_role
order by 1;
PRIVILEGE
----------------------------------------
CREATE ANALYTIC VIEW
CREATE ATTRIBUTE DIMENSION
CREATE CLUSTER
CREATE HIERARCHY
CREATE INDEXTYPE
CREATE MATERIALIZED VIEW
CREATE OPERATOR
CREATE PROCEDURE
CREATE PROPERTY GRAPH
CREATE SEQUENCE
CREATE SYNONYM
CREATE TABLE
CREATE TRIGGER
CREATE TYPE
CREATE VIEW
15 rows selected.
SQL>
-- Role Privileges
select rp.granted_role
from dba_role_privs rp
where rp.grantee = :v_role
order by 1;
GRANTED_ROLE
--------------------------------------------------------------------------------
SODA_APP
SQL>
-- Object Privileges
column table_name format a30
select tp.privilege, tp.table_name
from dba_tab_privs tp
where tp.grantee = :v_role
order by 1, 2;
no rows selected
SQL>
复制
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 Privileges
select sp.privilege
from dba_sys_privs sp
where sp.grantee = :v_role
order by 1;
PRIVILEGE
------------------------------
CREATE CUBE
CREATE CUBE BUILD PROCESS
CREATE CUBE DIMENSION
CREATE DIMENSION
CREATE DOMAIN
CREATE JOB
CREATE MINING MODEL
CREATE MLE
CREATE SESSION
DEBUG CONNECT SESSION
EXECUTE DYNAMIC MLE
FORCE TRANSACTION
ON COMMIT REFRESH
13 rows selected.
SQL>
-- Role Privileges
select rp.granted_role
from dba_role_privs rp
where rp.grantee = :v_role
order by 1;
GRANTED_ROLE
--------------------------------------------------------------------------------
CTXAPP
RESOURCE
SQL>
-- Object Privileges
column privilege format a30
column table_name format a30
select tp.privilege, tp.table_name
from dba_tab_privs tp
where tp.grantee = :v_role
order by 1, 2;
PRIVILEGE TABLE_NAME
------------------------------ ------------------------------
EXECUTE DBMS_REDACT
EXECUTE DBMS_RLS
EXECUTE DBMS_TSDP_MANAGE
EXECUTE DBMS_TSDP_PROTECT
EXECUTE JAVASCRIPT
READ V_$PARAMETER
READ V_$STATNAME
SELECT DBA_PENDING_TRANSACTIONS
SQL>
复制
在长期的数据库使用实践中,Oracle 官方一直强调“最小权限原则(Least Privilege Principle)”,即建议用户仅被授予完成任务所必需的最少权限,以降低安全风险和误操作的可能性。
通过上述对比可以看出,DB_DEVELOPER_ROLE
所授予的权限远多于 CONNECT
和 RESOURCE
两个角色的总和。这意味着它功能更强,但也需要更高的权限管控意识。
对于一些对权限敏感的行业或单位(例如金融、电信、政务系统等),建议在启用该角色前进行评估:是否需要如此多的权限?是否所有开发人员都适合直接使用这个角色?是否应基于它自定义更细粒度的角色?
另外,RESOURCE
角色新增了更多权限,这意味着习惯性授予 CONNECT + RESOURCE
角色的用户,实际上已经接近于 DB_DEVELOPER_ROLE
所授予的权限级别。建议根据实际需求重新评估这两个角色的组合使用。