Oracle的权限设置十分复杂,权限分类也很多、很细。就系统权限而言,Oracle的系统权限超过200种。这就为数据库管理员正确有效地管理数据库权限带来了困难,而角色就是简化权限管理的一种数据库对象。
角色是一个独立的数据库实体,它包括一组权限。也就是说,角色是包括一个或者多个权限的集合,它并不被哪个用户所拥有。角色可以被授予任何用户,也可以从用户中将角色收回。
用角色可以简化权限的管理,可以仅用一条语句就能从用户那里授予或撤销一组权限,而不必对用户一一授权。使用角色还可以实现权限的动态管理。
角色、用户及权限是一组关系密切的对象,既然角色是一组权限的集合,那么它只有被授予某个用户才有意义,可以用下图所示的图形来理解角色、用户及权限之间的关系。
在复杂的大型应用系统中,首先要求对应用系统功能进行分类,以形成角色的雏形;然后使用CREATE ROLE语句将其创建成为角色;最后根据用户工作的分工,将不同的角色(包括系统预定义的角色)授予各类用户。如果应用系统的规模很小,用户数也不多,则可以直接将应用的权限授予用户,即使是这样,用户也必须对Oracle系统的预定义角色有所了解,因为一个用户至少被授予一个以上的预定义角色时才能使用Oracle系统资源。
在创建角色时,可以为角色设置应用安全性。角色的安全性是通过为角色设置口令进行保护的,必须提供正确的口令才允许修改或设置角色。
系统预定义角色,是指在数据库安装完成后由系统自动创建的一些常用角色,这些角色已经由系统授予了相应的系统权限,可以由数据库管理员直接使用。一旦将这些角色授予用户,用户就具有了角色中所包含的系统权限。
以下列出的这几个系统预定义角色是最常被用到的:CONNECT、RESOURCE、DBA、EXP_FULL_DATABASE和IMP_FULL_DATABASE。
CONNECT、RESOURCE及DBA主要用于数据库管理,这3个角色之间相互没有包含关系(有些系统权限可能有重叠)。数据库管理员需要分别授予CONNECT、RESOURCE和DBA角色。对于一般的数据库开发人员,则需要授予CONNECT和RESOURCE角色。
角色IMP_FULL_DATABASE和EXP_FULL_DATABASE分别用于操作数据库的导入或导出工具,如操作数据库工具EXPDP、IMPDP,或者系统的EXP、IMP。
在使用这些工具进行整个数据库的导出与导入时,需要具备这两个角色。
Oracle中部分常用预定义角色的权限说明如下表所示:
不同版本的Oracle预定义的角色数量不同,但都可以从dba_roles数据字典中查询到。
–查询dba_roles数据字典中的角色信息
select * from dba_roles;
如果系统预定义的角色不符合用户需要,那么数据库管理员可以创建更多的角色,
创建用户自定义角色可以使用CREATE ROLE语句来实现,其语法格式如下:
CREATE ROLE role_name [ NOT IDENTIFIED | IDENTIFIED BY [password] | [EXETERNALLY] | [GLOBALLY]]
role_name:角色名。IDENTIFIED BY password:角色口令。
IDENTIFIED BY EXETERNALLY:表示角色名在操作系统下验证。
IDENTIFIED BY GLOBALLY:表示用户是由Oracle安全域中心服务器来验证,此角色由全局用户来使用。
创建一个名为designer的角色,该角色的口令为123456,代码如下:
create role designer identified by 123456;
一旦角色创建完成,就可以对角色进行授权,给角色授权也是使用GRANT…TO语句来完成的。
如果系统管理员具有GRANT_ANY_PRVILEGE权限,就可以对某个角色进行授权。
例如,授权CREATE SESSION、CREATE SYNONYM、CREATE VIEW等。
给designer角色授予CREATE VIEW和CREATE TABLE权限。
代码如下:
grant create view,create table to designer;
在角色获得了权限之后,就可以把这个有使用价值的角色授予给某个用户。把角色授予给某个用户仍然使用GRANT…TO语句来实现。
–把designer角色授权给用户dongfang
grant designer to dongfang;
–查询角色designer被授予的权限有哪些
select * from role_sys_privs where role = 'DESIGNER';
修改角色密码包括取消角色密码和设置角色密码两种情况,可以使用ALTER ROLE语句来实现。
首先取消designer角色的密码,然后重新给该角色设置一个密码,
代码如下:
–取消角色密码
alter role designer not identified;
–设置角色密码
alter role designer identified by mrsoft;
假设用户a有三个角色,分别为b1、b2、b3,那么如果b1未生效,则b1所包含的权限对于a来讲是不拥有的,只有角色生效了,角色内的权限才作用于用户。最大可生效角色数由参数MAX_ENABLED_ROLES设定。用户登录后,Oracle将所有直接赋给用户的权限和用户默认角色中的权限赋给用户。设置角色生效可使用SET ROLE语句。
创建一个无须密码验证的角色queryer,然后设置该角色生效,最后设置带有密码的角色designer也生效,
代码如下:
–创建角色queryer
create role queryer;
–设置角色生效
set role queryer;
–设置带有密码的角色designer也生效
set role designer identified by mrsoft;
如果要设置带有密码的角色生效,则必须在SET ROLE语句后面使用IDENTIFIED BY关键字指定角色的密码。
使用DROP ROLE语句即可删除角色。
–删除角色queryer
drop role queryer;
删除角色后,原来拥有该角色的用户将不再拥有该角色,相应的权限也将失去。
创建角色和用户以后,给角色和用户授予的权限被记录在Oracle的数据字典里。
下表列出了Oracle用于存储用户、角色及权限的相关数据字典。
–查询scott用户被授予的系统角色
select granted_role,default_role,grantee from dba_role_privs where grantee = 'SCOTT';
在某个模式下,如果用户要确定当前会话中的所有有效角色,可通过session_role数据字典来查询。
–在scott模式下,查询当前用户的所有有效角色
select * from session_roles;