c语言sscanf函数的用法是什么
349
2022-09-26
oracle中角色中权限剥离
1 | Oracle三层权限体系【复习】 |
| 1、Oracle的权限体系划分为三个层次:角色role、系统system和对象object。下面进行简单的说明:
ü 对象权限(object privilege),是权限体系的最小粒度对象。特点是权限点在对象上。此处的对象,包括Oracle体系下包括数据表、视图、序列、包、存储过程等十一种对象的权限。每种对象都有对应的权限点。比如,对数据表有select、update等操作权限; ü 系统权限(system privilege),是描述Oracle用户操作的另一个层面。定义了用户在系统中可以做什么,如Create table之类。注意,一些系统权限和对象权限可能存在重叠的情况。要小心使用。 ü 角色权限(role privilege),是对象权限和系统权限、甚至包括角色权限的复合体。对象权限和系统权限都是粒度很细的权限单元,一类用户往往需要相同的对象权限集合和系统权限集合。如果分别进行设置,就可能存在遗漏的可能,依据职责进行role角色设置,之后将角色附加给用户,是一种更加简单的方法;
2、对象权限object privilege 对象权限是Oracle的基础权限,定义了用户在某个特定对象上可以使用何种权限。注意,此处我们谈到的对象权限,是针对已经存在对象的权限。目前,Oracle支持十一种对象的九方面权限,并不是每类型对象都有全部的九个方面权限。详细如下表: 从上表中可以看出,根据对象的不同,可以进行赋予的权限也是不同的。此外,还有一个隐式的all权限,表示对象可以赋予的全部权限信息。视图方面,可以使用user_tab_privilege和table_privilege等视图检查对象的访问授权情况。
3、系统权限System Privilege:系统权限是Oracle内置定义的,在Oracle10g中有大约160余个系统权限
4、角色权限role privilege:角色权限可以接受各种系统权限和对象权限,也可以包括其他的角色权限。在实际开发过程中,我们自定义角色的场景其实不是很多,因为自定义角色权限后,在开发使用时是有很多的限制的。需要注意的问题是,不同版本的Oracle,预定义角色可能存在差异。 |
|
|
2 | 角色role不能循环赋予 |
| //自定义两个空权限角色; SQL> create role r_t; Role created
SQL> create role r_m; Role created
//相互尝试赋予权限; SQL> grant r_t to r_m; Grant succeeded
SQL> grant r_m to r_t; grant r_m to r_t
ORA-01934:检测到循环的角色授权
实验结论显而易见:Oracle在进行grant角色相关授权的时候,会自动进行循环检测,如果发现循环,就禁止掉操作。 |
|
|
3 | 角色权限在存储过程中的剔除效应 |
| 角色的确是一种很方便的权限集合组织方式,在很多系统中也是广泛应用。但是在Oracle中,使用角色权限role privilege是要格外小心的,特别是进行数据库开发过程中。因为Oracle存储过程等结构对角色权限有剔除效应。 【实验】 //建立实验角色r_cat_role SQL> create role r_cat_role ; Role created
//授予系统权限select any dictionary给实验角色,select any dictionary权限可以访问到Oracle的大部分元数据视图。 SQL> grant select any dictionaryto r_cat_role; Grant succeeded
//创建用户 SQL> create user mytest identified by mytest; User created
SQL> grant create session to mytest; Grant succeeded
SQL> grant r_cat_role to mytest; Grant succeeded
SQL> grant create procedure to mytest; Grant succeeded
SQL> conn mytest/mytest@ora11g; Connected to Oracle Database11gEnterpriseEdition Release11.2.0.1.0 Connected as mytest
SQL> select count(*) fromdba_objects;
COUNT(*) ---------- 72282
dba_objects视图是元数据字典的一个组成部分。mytest用户在接受角色权限r_cat_role之后,具有了在SQL中直接使用的权限。下面我们构造存储过程如下:
SQL> create or replace procedure P_TEST_NC 2 is 3 n_res number; 4 begin 5 select count(*) 6 into n_res 7 from dba_objects; 8 9 dbms_output.put_line(to_char(n_res)); 10 end P_TEST_NC; 11 /
Warning: Procedure created with compilation errors
SQL> select * from user_errors;
NAME TYPE SEQUENCE LINE POSITION TEXT ATTRIBUTE ---------- ------------ ---------- ---------- ---------- ---------------------------------------- --------- P_TEST_NC PROCEDURE 1 7 8 PL/SQL: ORA-00942:表或视图不存在 ERROR P_TEST_NC PROCEDURE 2 5 3 PL/SQL: SQL Statement ignored ERROR 编译报错,看起来不可思议。明明mytest用户具有dba_objects视图的访问权限,而且在SQL语句直接可以使用。我们说,就是因为访问dba_objects的权限是通过角色授予的。存储过程等Oracle代码结构具有一个特性,就是可以将用户的三层权限(role、system和object)中的role权限剥离掉。 |
|
|
4 | 系统权限和对象权限冲突 |
| 系统权限中包括一部分与对象有关的内容。如select any table、execute any procedure等。这些和对象权限之间存在一些重叠的部分。 【实验】 SQL> create user mytest identified by mytest; User created
SQL> grant connect, resource to mytest; Grant succeeded
SQL> grant select any table to mytest; Grant succeeded
SQL> conn mytest/mytest@orcl; Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0 Connected as mytest
SQL> select count(*) from scott.emp; COUNT(*) ---------- 14
尝试可否从scott用户上禁止mytest对m的访问。
SQL> conn scott/tiger@orcl; Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0 Connected as scott
SQL> revoke select on t from mytest;
revoke select on t from mytest
ORA-01927:无法REVOKE您未授权的权限 可见看出,对Oracle的revoke而言,只能revoke授予过的权限。未授予过的权限,或者尝试对系统权限、对象权限语义的拆分,都是不能做到的。 |
|
|
5 | 拥有select any table权限,但是对sys用户下的数据表,是不能访问的。这是Oracle内部对于sys用户核心对象的一种保护措施。例如sys用户创建了一张test表,具有select any table权限的用户是无法查询sys.test表。 此外具有select any table 权限的用户也无法查看sys schema下的系统视图,要想查看,需要把参数o7...设置成true |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~