(1)创建角色
创建角色的用户应该具有create role系统权限,调用SQL语句CREATEROLE创建角色,其语法格式为:
其中:
①role_name:指出所创建的角色名称,在一个数据库中,每一个角色名不能与所有数据库用户名相同,也不能与其他角色名相同。
②NOT IDENTIFIED:说明该角色使用数据库认证方式,但是在启用(调用SET ROLE语句)时不需要口令。
③IDENTIFIED:说明调用SET ROLE语句激活角色时,用户必须按指定的方法提供验证。角色验证方法与用户验证一样,可以采用数据库口令验证(使用BY子句提供口令)、外部认证和全局认证。
例如,下面创建两个角色sr_admin、sr_query,它们均采用数据库口令认证方式。
(2)给角色授权
为角色添加权限非常简单,调用GRANT语句可以把系统权限、对象权限以及其他角色授予角色。语法格式如下:
如果将角色授予PUBLIC,Oracle数据库将使所有用户可以使用该角色。
上面语句中的WITH ADMIN OPTION子句与系统权限授权中的作用一样,它要求把角色的管理权限授予指定的用户或角色。
例如,下面语句分别把系统权限(CREATE SESSION)、对象权限和角色(自定义角色sr_query和系统预定义角色connect)授予前面创建的两个角色。
(3)管理用户角色
1)向用户授予角色
角色创建和授权之后,要把角色授予用户,才能实现向用户间接授权的目的。向用户授予角色操作与向用户授予系统权限一样,需要调用GRANT语句,其语法格式为
如果将角色授予PUBLIC,Oracle数据库将使所有用户可以使用该角色。
上面语句中的WITH ADMIN OPTION子句与系统权限授权中的作用一样,它要求把角色的管理权限授予指定的用户或角色。
例如,下面语句把前面创建的sr_admin角色授权给用户zhang。
又如,下面语句把前面创建的sr_query角色授权给用户zhang,并同时向其授予该角色的管理权限。
查询数据字典user_role_privs可以了解用户自己目前已加入了哪些角色。例如,用户zhang在连接之后执行下面语句,查询到授予自己的两个角色,它们都不是该用户的默认角色。
2)撤销用户角色
角色授予用户或其他角色之后,可调用REVOKE语句撤销。例如,下面语句将撤销授予用户zhang的角色sr_query:
撤销用户角色对已经启用该角色的用户会话没有影响,所以这些用户会话仍可使用被撤销角色的权限进行操作,但该用户之后不能再启用该角色。
3)启用和禁用角色
角色授予用户之后,其默认为禁用状态,这时用户连接之后,还没有获得角色所具有的权限。用户要想获得授权给角色的权限,需要调用SET ROLE语句启用角色。SET ROLE语句同时还可以禁用角色,其语法格式为:
SET ROLE{角色1[IDENTIFIED BY口令]
[,角色2[IDENTIFIED BY口令]]...
|ALL[EXCEPT角色a[,角色b]...]
|NONE};
其中:
①角色1、角色2等指出需要启用的角色,角色使用数据库口令认证时,需要在IDENTIFIEDBY子句中提供相应的口令,如果没有为角色设置口令,则无须提供IDENTIFIEDBY子句。
②ALL指出为当前会话启用用户已加入的所有角色,而ALL EXCEPT子句指出启用用户已加入角色中除角色a、角色b等之外的所有角色;使用ALL或ALL EXCEPT子句时要确保所启用的所有角色均没有设置口令,否则将导致该语句执行失败。
③NONE指出禁用当前会话的所有角色,其中包括用户的默认角色。
例如,用户zhang在启用角色之前执行下面语句失败,说明他没有获得角色sr_query所具有的权限。
在执行下面语句激活角色sr_query之后,通过该角色获得了对hr.departments表的查询权限,因此可以执行查询。
这里需要注意的是,我们前面已经撤销了用户zhang的sr_query角色,为什么还能启用它,并通过它获得对hr.departments表的查询权限?这是因为管理员通过sr_admin角色间接把角色sr_query授予了用户zhang。所谓间接角色是指通过授予用户的另一个角色授权给用户的角色。例如,用户把角色sr_admin直接授权给用户zhang,而前面已经把角色sr_query授权给了sr_admin,所以sr_admin是用户zhang的直接角色,而sr_query成为其间接角色。用户在启用直接角色时,会自动随之启用间接角色,这时不需要为间接角色提供认证口令。用户会话不再需要角色所提供的权限时,应该禁用角色。禁用角色不需要再提供口令,如下面语句禁用用户zhang当前会话中已启用的所有角色:
4)设置用户默认角色
用户默认角色在用户连接后被自动激活,所以用户不用显式启用角色就可以立即获得它们所具有的权限。使用ALTER USER语句设置用户的默认角色,其语法格式为:
ALTER USER用户DEFAULT ROLE
{角色1[,角色2...]
|ALL[EXCEPT角色a[,角色b]...]
|NONE};
上面语句说明把角色1、角色2等设置为用户的默认角色,或者把用户已加入角色中除角色a、角色b等之外的所有角色设置为默认角色。
NONE选项指出把用户已加入的所有角色设置为非默认角色。
从下面查询中可以看出上面语句的设置结果:
这样用户zhang在下次连接后将自动激活角色sr_admin,同样也将自动激活与sr_admin相关的间接角色sr_query。直接获得它具有的权限。
调用SET ROLE NONE语句也可以禁用隐含激活的默认角色。例如:
之后用户zhang失去从默认角色继承的对hr.departments的查询权限,因此导致下面查询语句失败:
需要注意的是,虽然执行SET ROLE语句可以启用和禁用直接角色和间接角色,但调用ALTER USER语句设置用户默认角色时,只能把直接角色设置为用户的默认角色,而不能把间接角色设置为用户的默认角色。因此,在执行下面语句时就会产生错误:
(4)查询角色信息(www.daowen.com)
Oracle数据库内所创建的角色,以及与角色授权相关的信息均存储在数据字典内,与角色相关的数据字典见表7.4。
表7.4 与角色相关的数据字典
例如,执行下面语句可以分别查询授予角色sr_admin的角色、系统权限和对象权限信息。
又如,下面语句从数据字典dba_role_privs查询授予用户zhang的角色信息,该字典内各列的作用如下所述。
①GRANTEE:被授予角色的用户或角色名称。
②GRANTED_ROLE:授予的角色名称。
③ADMIN_OPTION:说明授予角色时是否带有ADMIN OPTION。
④DEFAULT_ROLE:指出该角色是否被指定为用户的默认角色。
(5)修改和删除角色
创建角色后,调用ALTER ROLE语句可以修改角色。ALTER ROLE语句中的各子句与CREATE ROLE语句的相同,这里不再重复列出。例如,下面语句把前面创建的sr_query角色从口令认证方式修改为无须口令认证。
修改角色对已经启用该角色的用户会话没有影响,它只影响之后所建立的用户会话。调用SQL语句DROP ROLE可以删除数据库内的角色,其语法格式非常简单:
在删除角色时,Oracle将把它从被授予到的所有用户和角色中撤销,并从数据库中删除。删除角色不仅会影响之后所建立的用户会话,还会对已经启用该角色的用户会话立即产生影响。OracleDatabase SQL Language Reference 11g Release 2(11.2)文档中DROP ROLE语句说明部分指出删除角色对已经启用该角色的用户会话不会产生影响,而从下面实际操作看,这一说明与事实不符。
以上语句能够成功执行说明用户zhang已经获得了角色sr_admin和sr_query的权限。接下来,DBA删除角色sr_admin。
此后,用户zhang在不重新登录的情况下执行下面语句失败,说明删除角色sr_admin影响到已经启用该角色的用户会话。
但此时,用户zhang仍能执行下面查询,这说明虽然删除了角色sr_admin,但已经建立的用户会话通过间接角色sr_query得到的权限不受sr_adrnin删除的影响。
接下来,DBA删除角色sr_query:
此后,用户zhang无法成功执行下面语句,这说明无论角色是用户的直接角色还是间接角色,只要删除它们,就会对用户立即产生影响(包括已经建立的会话)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。