角色管理
可以把角色视为可用单条GRANT
或REVOKE
命令予和撤销的一组权限集合。一个角色可以包含一组权限,同时还可以包一组角色。角色使分配多个权限给一个用户变得非常容易。默认角色是用户创建会话时自动起作用得一种角色,可以给用户分配不止一个默认角色。
DBA角色是数据库中预先定义的角色,它是一组系统权限WITH ADMIN OPTION,这表示具有这个角色的用户可将这些系统权限授予其他用户。大多数情形下将这个角色授予进行数据库管理的用户,DBA角色权限很大,一定要慎重授予用户。
Oracle数据库有三个重要的角色:
-
CONNECT:
CREATE SESSION
(在Oracle10g版本2以前,CONNECT角色还有几个其他权限,但现在只有单一的CREATE SESSION
权限); -
RESOURCE:
CREATE CLUSTER
、CREATE INDEXTYPE
、CREATE OPERATOR
、CREATE PROCEDURE
、CREATE SEQUENCE
、CREATE TABLE
、CREATE TRIGGER
、CREATE TYPE
; -
DBA角色:
所有系统权限WITH ADMIN OPTION
。
还有两个预定义角色
EXP_FULL_DATABASE
和IMP_FULL_DATABASE
,他们允许用户在数据库执行Data Pump Export和Import。
1、创建角色:
如果用户被授予DBA角色
或CREATE ROLE
的特殊系统权限,就可以创建用户
CREATE ROLE new_role;
将权限授予角色:
示例:
#创建会话权限
GRANT CONNECT TO NEW_ROLE;
#查询所有表权限
GRANT SELECT ANY TABLE TO NEW_ROLE;
#更新所有表权限
GRANT UPDATE ANY TABLE TO NEW_ROLE;
#可以查看一些role的定义数据字典的视图(如dba_之类)
GRANT select_catalog_role TO NEW_ROLE;
#数据泵导出权限
GRANT exp_full_database TO NEW_ROLE;
#数据泵导入权限
GRANT imp_full_database TO NEW_ROLE;
将上述权限赋予DIANA用户:
GRANT NEW_ROLE TO DIANA;
查看当前用户所拥有的权限:
select * from session_privs;
一个用户可以被授予不止一个角色,授予用户的所有角色在此用户登录数据库时都是活动的。
2、角色认证:
使用角色不需要使用密码,但可以指定一个角色在使用前必须认证,指定角色认证的方法有下面几种:
- 数据库认证:在角色由数据库认证时使用的密码,如下:
CREATE ROLE new_role IDENTIFIED BY password;
- 使用一个PL/SQL程序包进行数据库认证:开发人员可创建一个角色并指定用一个PL/SQL程序包来认证该角色,如admin_role角色由PL/SQL程序包hr.admin中定义的一个模块来启用,如下:
CREATE ROLE admin_role IDENTIFIED USING hr.admin;
- 外部,由操作系统,网络或其他外部源认证:可要求一个角色启用前由某个外部源进行认证,如下:
CREATE ROLE acc_rec IDENTIFIED EXTERNALLY;
- 全局,由一个企业目录服务器认证:也可以定义一个角色为全局角色,这表示用户只能由企业目录服务授权使用该角色。
示例:创建一个由目录服务授权的全局角色,如下:
CREATE ROLE supervisor IDENTIFIED GLOBALLY;
WITH ADMIN OPTION 授权角色
如果使用WITH ADMIN OPTION 字句授予用户一个角色,则被授予者可做以下事情:
(1)对数据库中的任何用户或角色授予或撤销此角色;
(2)用with admin option 授权此角色;
(3)更改或删除此角色。
将一个角色授予其他角色
一般是将角色授予一个用户,然后该用户就可以立即行使角色所包含的所有权限。但是,也可以将一个角色授予另一个角色。在此情形下,数据库将把前者的所有权限添加到后者的权限中。
3、禁用和启用一个角色
可插入适当的行到Product_User_Profile表中禁用一个角色
示例:(new_role角色已经授予DIANA用户)
SQL> select * from product_user_profile;
no rows selected
SQL> desc product_user_profile
Name Null? Type
------------------------ -------- ----------------------------
PRODUCT NOT NULL VARCHAR2(30)
USERID VARCHAR2(30)
ATTRIBUTE VARCHAR2(240)
SCOPE VARCHAR2(240)
NUMERIC_VALUE NUMBER(15,2)
CHAR_VALUE VARCHAR2(240)
DATE_VALUE DATE
LONG_VALUE LONG
SQL> INSERT INTO PRODUCT_USER_PROFILE(product,userid,attribute,char_value) VALUES('SQL*Plus','DIANA','ROLES','NEW_ROLE');
1 row created.
SQL> commit;
Commit complete.
SQL> conn diana/diana
Connected.
SQL> select * from product_user_profile;
PRODUCT USERID ATTRIBUTE SCOPE NUMERIC_VALUE CHAR_VALUE DATE_VALUE LONG_VALUE
----------- ------- ----------- ----- ----------------- ----------- ----------- ----------------
SQL*Plus DIANA ROLES NEW_ROLE <Long>
SQL> select * from nice.STUDY;
select * from nice.STUDY
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL>
4、删除角色
DROP ROLE role_name;
至此结束,部分内容会后续补充,谢谢。