(一)权限分为多个domain(系统与对象权限均是)
通过授予role, 再把role授予user,这就产生了2个domain:
user domain权限与role domain权限,因为是不同domain,所以在查看用户权限dba_sys_privs是不包含role所授予的权限的,同时revoke不能单独收回role domain的权限的
role同时又可以授予role,如把role2授予role1, 这时把role1授予user, 这时称role2为indirectly grant role
此时user将同时具有role1与role2的权限,但这实现又产生了两个domain,即从dba_role_privs 只能查到user被授予了role1而查不到被授予了role2, 要再通过ROLE_ROLE_PRIVS查
注:不能循环授予,如role3授予role2,role2授予role1,而role1又授予role3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以在看用户包含哪些权限时需要把所有doman均查询:
查看某个用户的权限:
1. 系统权限:
select * from dba_sys_privs where grantee='PUBLIC'; ---每个用户都有public权限,public默认包含一些对象权限,这里只需确认下public没有系统权限
第一层:select * from dba_sys_privs t where t.grantee='SCOTT';
第二层:select * from dba_role_privs where grantee='SCOTT';
select * from dba_sys_privs where grantee= 'DBA' ;
select * from dba_sys_privs where grantee= 'RESOURCE' ;
select * from dba_sys_privs where grantee= 'CONNECT' ;
第三层:select granted_role from role_role_privs where role='DBA';
select granted_role from role_role_privs where role='RESOURCE';
select granted_role from role_role_privs where role='CONNECT';
select * from dba_sys_privs where grantee= 'xxxx' ;
select * from dba_sys_privs where grantee= 'xxxx' ;
select * from dba_sys_privs where grantee= 'xxxx' ;
第四层: ....
把上面权限综合才为用户的所有系统权限,不同层次的权限不能单独revoke
简单的方法是使用此用户登陆查看:select * from session_privs; --它不分角色和权限,会列出所有具体权限
2. 对象权限:因为对象权限也可以授予role, 所以查询顺序同上:
select * from dba_tab_privs where grantee='PUBLIC';
第一层: select * from dba_tab_privs t where t.grantee='SCOTT';
第二层:select * from dba_role_privs where grantee='SCOTT';
select * from dba_tab_privs where grantee= 'DBA' ;
select * from dba_tab_privs where grantee= 'RESOURCE' ;
select * from dba_tab_privs where grantee= 'CONNECT' ;
第三层:select granted_role from role_role_privs where role='DBA';
select granted_role from role_role_privs where role='RESOURCE';
select granted_role from role_role_privs where role='CONNECT';
select * from dba_tab_privs where grantee= 'xxxx' ;
select * from dba_tab_privs where grantee= 'xxxx' ;
select * from dba_tab_privs where grantee= 'xxxx' ;
第四层: ....
把上面权限综合才为用户的所有对象权限
(二)dependent
为成功执行一些DDL操作,你可能需要授予多个权限
如授予了create table或create any table,你就能创建表了,但如果只有create view或create any view权限,并不能创建视图,还需要相关表的select权限
为了避免上面DDL的权限依赖关系导致ROLE间的依赖,oracle对了如下限制:
1)如果执行DDL的全部权限都包含在同一role下,则用户可以执行DDL
2)如果执行DDL的部分权限包含在一个role下,另一部分被直接授予了user,则用户可以执行DDL
3) 如果执行DDL的部分权限包含在一个role下,另一部分包含在另一role下,则用户无法执行DDL
示例:
user被直接授予了select departments表权限,授予了role1(包含create view权限),授予了role2(包含select empoloyees表),则此时
1)用户可以访问departments及empoloyees表
2)用户无法创建empoloyees表的视图,但可以创建departments表视图