目录
LLL的数据库培训—第二部分—Oracle基础知识培训—第15讲—角色管理
一、为什么要引入角色?
1、为什么要引入角色
假设现在正在管理一个有1000个用户的大型系统,而且这些用户是陆续建立的,每个用户需要20小系统权限。为了简化问题,进一步假设所有的用户都需要完全一样的系统权限。
如果将这20种系统权限分别授予这1000个用户,所有的系统权限使用数将达到20×1000=20000次。
另外,如果使用的系统权限需要修改,其修改量也是惊人的。
为了解决这一难题, Oracle引入了角色。
2、什么是角色?
(1)角色是一组命名的相关权限,权限可以通过这个名字授予用户或其他的角色。
(2)但是一个角色不能授予自己,也不能循环授予。
(3)角色既可以包括系统权限,也可以包括对象权限。
(4)每一个角色在系统中必须是唯一的,即不能与任何有的用户名和角色名重名,而且角色不属于任何用户,也不存在于任何用户模式中。
(5)角色的描述存放在数据字典中。
3、使用角色来管理权限的好处
(1)权限管理较容易
通过使用角色会使授予和回收系统权限的维护工作简单许多。
如上面的例子现在就可以通过角色来对用户授权。可以先将20种系统权限都授予一个角色,之后再把这个角色赋予这1000个用户。
这样,所有的系统权限使用的次数就将变为20+1000=1020次动态的权限管理:通过使用角色,如果用户使用的系统权限需要增加或减少,其工作量也会明显下降。
(2)可以提高系统的效率:
无论是使用直接授权还是通过角色授权,最终有关用户权限的信息都要记录到数据字典中(磁盘上)。
直接授权:直接把对对象访问的权限赋予用户;
角色授权:把对方访问的权限统一赋予给角色,再把此角色赋予给用户
这里继续使用前面的例子,如果使用的是直接授权法,记录到数据字典中(磁盘上)的有关用户权限的信息为20000项。
而当使用的是通过角色授权的方法时,记录到数据字典中(磁盘上)的有关用户权限的信息就只有1020项。
磁盘上的数据少了,查询时的IO也就少了,因此 Oracle服务器查询数据字典的速度也就会加快很多。换句话说,就是提高了系统的效率。
(3)可以通过操作系统授权:
可以使用操作系统命令或应用程序将角色赋予数据库中的用户。
这一点对开发应用系统很有用可以有选择地使用权限:可以通过激活或禁止命令来临时地开启或关闭角色的功能。
二、角色的使用
1、预定义角色。
(1)connect自动建立,包含以下权限:
alter session
create cluster
create databaselink
create sequence
create session
create synonym
create table
create view
(2)resource自动建立,包含以下权限:
create cluster
create procedure
create sequence
create table
create triggr
(3)dba (数据库管理员角色)
dba role拥有所有的系统权限,包括无限制的空间限额和给其他用户授予各种权限的能力。system就拥有dba角色。
2、显示角色信息的视图
(1)确定角色的权限【所有用户查】
select * from role_tab_privs; 包含了授予角色的对象权限【即,授权表或其他对象出去的用户的信息。如将llltest4的表的select权限授权给角色lll_role4,并将111_role4授权给用户test4,那么此句可以查出llltest4的信息,而非test4的信息】
select * from role_role_privs; 包含了授予另一角色的角色【】
select * from role_sys_privs ; 包含了授予角色的系统权限【当前查询用户的拥有的系统权限】
(2)确定角色的权限【sys用户查】
select * from DBA_tab_privs; 直接授予用户帐户的对象权限【针对所有表、视图等的权限的授予,40000多条】
select * from DBA_role_privs; 授予用户帐户的角色【针对所有用户所有分配的角色明细,140多条】
select * from DBA_sys_privs; 授予用户帐户的系统权限【700多条】
(3)确定当前用户的权限【所有用户查】
select * from user_tab_privs;
select * from user_role_privs;
select * from user_sys_privs;
(4)用户信息
select * from user_users;
select * from dba_users;
select * from all_users;
(5)用户空间配额
select * from user_ts_quotas;
select * from dba_ts_quotas;
(6)查看所有用户role
select * from dba_roles;
select * from session_roles;
三、角色的创建与管理
1、角色的创建
除了前面讲到的三种系统角色----connect、 resource和dba,用户还可以在oracle创建自己的role。 用户创建的role可以由表或系统权限或两者的组合构成。 为了创建role,用户必须具有create role系统权限。
2、语法:
create role role_name [not identified(默认)|identified by password|externally|globally];
注:
(1)角色名唯一
同一个数据库中角色名称必须唯一,且不能使用已存在的用户名称;
(2)不支持with grant option的情况
给角色授予对象权限时,不支持with grant option 为角色授予对象权限;
(3)支持with admin option的情况
给角色授予系统权限时,支持with admin option 为角色授予系统权限或授予另一个角色;
首先,对test4用户执行,grant create table to lll_role4 with admin option;同样可以使用grant lll_role4 to test4 with admin option; 此时,test4拥有lll_role4且可以grant, 此时,可以执行这个语句授权角色给llltest,SQL> grant lll_role4 to llltest; 此时,llltest拥有lll_role4 最后,如果revoke lll_role4 from test4,llltest中仍然有lll_role4的角色。
(4)enterprise manager功能
使用enterprise manager创建某个用户时,该用户被自动授予了connect角色,即同时具有了该角色的所有权限。
(5)identified by password:
给角色设置密码。
(6)identified by externally:
代表启用了一个角色,用户必须是某个操作系统组的一个成员,改操作系统组的名称应当与角色相对应。当希望通过操作系统对角色进行身份认证,则需要设置os_role参数为true。
3、给角色授系统权限和对象权限
(1)创建角色
sys/system
create role lll_role;
select role,password_required from dba_roles where role='LLL_ROLE';
(2)授系统权限
grant create table,create view ,create session to lll_role with admin option;
(3)授对象权限
grant select,insert,update on llltest.test to lll_role;
(4)检查系统/对象权限
select * from role_sys_privs where role='LLL_ROLE'; --查看角色拥有的系统权限
select * from role_tab_privs where role='LLL_ROLE'; --查看角色拥有的对象权限
4、角色授权给用户
grant lll_role to lll;
grant lll_role to lll with admin option;
5、检查角色授权信息
select * from dba_role_privs where granted_role='LLL_ROLE'; select * from user_role_privs; select * from session_roles;
6、取消角色/删除角色
(1)取消角色
revoke lll_role from llltest;
(2)删除角色
drop role lll_role;
7、授权用户给默认的角色
grant resource,connect to llltest;
grant dba to llltest;
8、授权角色排除法(或称为角色禁用)
alter user llltest default role all except dba;--这个好像不太好用
通过上述操作,用户llltest对dba的default role值是NO状态,也就是未激活状态,无法使用。用户必须执行sql>set role dba,才可以启动此角色;
select * from dba_role_privs where grantee='LLLTEST';
9、激活和禁止角色
(1)禁用角色
set role none;
(2)激活角色
set role all; set role connect;
(3)关于connect和resource预定义角色:
resource具有创建表,索引,视图和其他的oracle对象的能力,同时默认带有unlimited tablespace权限 connect授予所有的普通用户; connect和resource授予开发人员; oracle声称connect和resource角色是为了与它早期的版兼容而保留的,尽可能不要使用这两个角色,以避免产生安全漏洞。
10、给角色加密码,并进行调用:
create role lll_role2 identified by 123; ----创建角色 grant select,insert,update on llltest11.test to lll_role2; ----给角色分配权限 create user test3 identified by test3; -----创建新用户 grant lll_role2 to test3; ---分配角色给新用户 conn test3/teset; ---新用户登录 set role lll_role2 identified by 123; ----输入角色密码(每次登录,需要重新设置一次才可以。不设置则提示此视图或表不存在) select * from llltest11.test; ----查询表
11、常用角色
角色 | 被授予的权限 |
dba | 几乎所有系统权限 |
select_catalog_role | 数据字典上的对象权限,未被授予任何系统权限 |
execute_catalog_role | 数据字典上的程序包、过程、函数的对象权限 |
delete_ctalog_role | delete on sys.aud$ delete on sys.fga_log$ |
exp_full_database | 从数据库中导出数据时查询任何表或序列、执行任何过程或类型以及修改数据字典对象的权限 |
imp_full_database | 执行导入时,在数据库除了sys模式之外的热河模式中创建对象的权限 |
connect | alter session |
create cluster | |
create database link | |
create sequence | |
create session | |
create synonym | |
createa table | |
create view |