在上一节我们谈到角色,角色是为了授权方便建立的权限集合,而一旦这个集合的权限超过了用户的最低需要,就可能带来数据库的安全风险。所以应当清楚的了解数据库中重要角色所具备的权限。
在数据库内部,用户和角色信息都存储在USER$表中,其中的TYPE字段用于标识类型,0位绝色,1为用户:
type# number not null, /* 0 = role, 1 = user */
通过视图DBA_ROLES可以查询数据库中定义的角色:
SQL> set autotrace on SQL> select * from dba_roles; ROLE PASSWORD ------------------------------ -------- CONNECT NO RESOURCE NO DBA NO SELECT_CATALOG_ROLE NO EXECUTE_CATALOG_ROLE NO DELETE_CATALOG_ROLE NO EXP_FULL_DATABASE NO IMP_FULL_DATABASE NO RECOVERY_CATALOG_OWNER NO GATHER_SYSTEM_STATISTICS NO LOGSTDBY_ADMINISTRATOR NO AQ_ADMINISTRATOR_ROLE NO AQ_USER_ROLE NO GLOBAL_AQ_USER_ROLE GLOBAL SCHEDULER_ADMIN NO HS_ADMIN_ROLE NO OEM_ADVISOR NO OEM_MONITOR NO WM_ADMIN_ROLE NO MGMT_USER NO 20 rows selected.
查询显示Oracle 10gR2的数据库中,包含20个角色,下面显示了SQL的执行计划,数据查询来自USER$:
Execution Plan ---------------------------------------------------------- Plan hash value: 4163253942 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 21 | 483 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| USER$ | 21 | 483 | 2 (0)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("TYPE#"=0 AND "NAME"<>'PUBLIC' AND "NAME"<>'_NEXT_USER')
注意查询的谓词信息,查询过滤了TYPE#=0和"NAME"<>'PUBLIC' AND "NAME"<>'_NEXT_USER'。这是视图中的特殊处理。从$ORACLE_HOME/rdbms/admin/ catalog.sql中可以获得DBA_ROLES创建的全部语句和过程:
create or replace view DBA_ROLES (ROLE, PASSWORD_REQUIRED) as select name, decode(password, null, 'NO', 'EXTERNAL', 'EXTERNAL', 'GLOBAL', 'GLOBAL', 'YES') from user$ where type# = 0 and name not in ('PUBLIC', '_NEXT_USER') /
那么也就可以知道数据库中存在两个特殊的用户角色对象:
SQL> select name from user$ where type#=0 2 minus 3 select role from dba_roles; NAME ------------------------------ PUBLIC _NEXT_USER
在Oracle 10gR2中CONNECT、RESOURCE两个角色的权限已经非常精简,可以通过查询ROLE_SYS_PRIVS视图获得角色具有的系统权限:
SQL> SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE='CONNECT'; ROLE PRIVILEGE ADM ------------------------------ ---------------------------------------- --- CONNECT CREATE SESSION NO SQL> SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE='RESOURCE'; ROLE PRIVILEGE ADM ------------------------------ ---------------------------------------- --- RESOURCE CREATE TRIGGER NO RESOURCE CREATE SEQUENCE NO RESOURCE CREATE TYPE NO RESOURCE CREATE PROCEDURE NO RESOURCE CREATE CLUSTER NO RESOURCE CREATE OPERATOR NO RESOURCE CREATE INDEXTYPE NO RESOURCE CREATE TABLE NO
在开发环境中,通常我们建议用户创建自己的角色来管理权限集合,以最小化原则来进行权限分配。
对于角色的授予情况,可以通过DBA_ROLE_PRIVS视图来查询,例如如下查询可以找出那些具有DBA角色的用户:
SQL> select * from dba_role_privs where granted_role='DBA'; GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ --- --- SMS8888 DBA NO YES SYS DBA YES YES SYSMAN DBA NO YES SMSSINA DBA NO YES SMS9999 DBA NO YES EYGLE DBA NO YES
对应于系统权限、对象权限、角色权限,相对应有DBA_SYS_PRIVS、DBA_TAB_PRIVS、DBA_ROLE_PRIVS提供常规查询,这是三个重要的视图,可以类比进行记忆。
最后修改时间:2019-09-23 17:01:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。