书城计算机数据库原理及Oracle应用
18254100000019

第19章 数据库的保护(3)

(3)对象权限的回收

使用REVOKE命令可以从一个用户或角色中回收对象权限,假如用户已经将此权限授予给其他用户,则用户都可以从其他用户身上回收此权限。回收对象权限的语法如下:

REVOKE{对象权限[,对象权限]……|ALL[PRIVILEGES]}

ON 对象名

FROM{用户名|角色|PUBLIC}[,{用户名|角色|PUBLIC}]……

其中:对象权限用于指定被授予的对象权限;ALL用于回收授予给用户的所有对象权限;ON用于指定将被回收对象权限的对象名;FROM用于指定将被回收权限的用户或角色。

注意:假如用户A被授予带WITH GRANT OPTION从句的对象权限,并且用户A又将此权限授予给了用户B,当用户A的权限被回收时,用户B的权限也被回收,并且用户A和B中与此权限有关的对象都变成无效。

例8-16 从JAMES身上回收对CUSTOMER表的更新权限。

SQL>REVOKE UPDATE ON CUSTOMER FROM JAMES

例8-17 scott用户从JAMES用户身上回收emp表上的所有权限。

SQL>REVOKE ALL ON emp FROM JAMES

(4)查询对象权限信息

对象权限可以从数据字典中获得。

8.1.2.3 角色的管理

1.角色的基本概念和特性

角色是一组相关权限的集合,角色可以被授予用户或其他的角色,使用角色使得权限的管理变得容易和好控制。角色拥有下列特性:

角色的授予和回收与系统权限的授予和回收有相同的命令;

角色可以授予任何用户或除了自己以外的角色;

角色必须授权后才是一组权限的集合,角色可以包含系统权限和对象权限;

角色不属于任何用户,角色的描述存储在数据字典中。

使用角色可以减少授权工作,也可以动态地管理权限。假如:与一个角色相关的权限被修改了,则所有被授予了此角色的用户自动获得修改后的权限。

2.角色的管理

(1)建立角色

使用CREATE ROLE命令可以建立角色,角色属于整个数据库,而不属于任何用户。当建立一个角色时,该角色没有相关的权限,系统管理员必须将合适的权限授予给角色。此时,角色才是一组权限的集合。建立角色的语法如下:

CREATE ROLE 角色名[NOT IDENTIFIED|IDENTIFIED{BY 口令}]

其中:NOT IDENTIFIED表示当角色生效时,不必验证口令,是默认值。IDENTIFIED BY 口令表示当角色生效时,必须指定口令。

例8-20 建立一个不带口令的角色HRCLERK。

SQL>CREATE ROLE HRCLERK

(2)角色的权限管理

建立完角色后需要给角色授权,授权后的角色是一组权限的集合。将角色授予给用户,与将系统权限授予给用户有相同的语法。将角色授予给用户的语法如下:

GRANT 角色名1[,角色名2]……

TO{用户名|角色|PUBLIC}[,{用户名|角色|PUBLIC}]……

[WITH ADMIN OPTION]

其中:角色名1、2表示被授予给用户或角色的角色名;用户名|角色表示接受角色的用户名或接受角色的角色名;PUBLIC表示将角色授予给所有用户;WITH ADMIN OPTION表示允许受权者又可以将此角色授予给其他用户。

例8-21 将emp表的SELECT和UPDATE权限授予给角色HRCLERK。

SQL>GRANT SELECT,UPDATE ON emp TO HRCLERK

从用户身上回收角色与从用户身上回收系统权限有相同的语法。从用户身上回收角色的语法如下:

REVOKE 角色1[,角色2]……

FROM{用户|角色|PUBLIC}[,{用户|角色|PUBLIC}]……

其中:角色1、2等表示从用户身上回收的角色名;用户|角色表示被回收系统权限用户名或角色名;PUBLIC表示从所有用户身上回收角色。

例8-22 从所有用户身上回收HRCLERK角色。

SQL>REVOKE HRCLERK FROM PUBLIC;

(3)修改和删除角色

使用ALTER ROLE命令可以修改角色的口令,但不能修改角色名。修改角色的语法如下:

ALTER ROLE 角色名{NOT IDENTIFIED|IDENTIFIED{BY 口令}}

其中:

NOT IDENTIFIED,IDENTIFIED,BY 口令的说明与建立角色时的说明一样。

例8-23 修改HRCLERK角色,设置一个口令。

SQL>ALTER ROLE HRCLERK IDENTIFIED BY COMMISION

使用DROP ROLE命令可以删除角色。即使此角色已经被授予给一个用户或其他角色,Oracle也允许用户删除该角色。删除角色的语法如下:

DROP ROLE 角色名;

当删除一个角色时,Oracle服务器从所有已经被授予了该角色的用户和角色身上回收该角色,并且从数据库字典中删除该角色。

删除角色的用户必须拥有DROP ANY ROLE系统权限,否则不允许删除该角色。

例8-24 删除HRCLERK角色。

SQL>DROP ROLE HRCLERK;

(4)查询角色信息

许多数据字典视图包含了授予用户和角色的权限信息,查询这些视图可以了解当前数据库中已经建立的角色,以及这些角色所拥有的系统权限和对象权限。

3.系统预定义的角色

当建立数据库时,Oracle自动定义了多个角色。这些角色定义在SQL.BSQ脚本文件中,当运行CREATE DATABASE命令时执行该脚本文件。

8.1.2.4 数据库审计

1.审计的类型

为了保证数据库安全性,可以使用审计记录数据库活动的信息,监视数据库有疑问的活动。审计可以分成:数据库审计和应用的审计。

(1)数据库审计

数据库审计监视和记录所选用户的数据库动作。审计信息存储在审计表中,使用审计表可以查看有疑问的活动。例如:数据库管理员可以对数据库中所有连接后所做的成功删除和不成功删除操作进行审计。可以收集正在被更新的表的统计信息,被执行的逻辑读的个数以及高峰时期并发用户的个数。

数据库审计需要通过设置参数AUDITTRIAL及执行审计命令进行审计。

(2)应用的审计

数据库审计不能记录列一级值的变化,假如数据库列的修改需要被跟踪并且每次修改的列的值需要被存储,可以使用应用审计。

值一级或应用审计由开发人员编写触发器或存储过程来实现。

例8-28 下列数据库触发器进行值一级审计。任何时候对雇员表做插入、修改、删除操作,触发器将列的修改前和修改后的值、正在做修改的用户名及时间日期等信息存储到一个用户定义的审计表中。

应用审计必须由开发人员编写触发器或程序来完成。只有数据库审计可以通过设置参数及执行审计命令进行审计。所以在这里重点介绍数据库审计的设置,和审计命令的语法,以及如何查询审计结果。

2.数据库审计的类型

当建立数据库时,Oracle建立SYS.AUD$审计表,用于存储审计记录。Oracle有三种类型的审计:语句审计、权限审计和对象审计。

(1)语句审计:审计所使用的SQL语句。

例8-29 审计由scott用户执行的所有SELECT 语句。

SQL>AUDIT SELECT BY scott;

(2)权限审计:审计所使用的权限。

例8-30 审计所有运用CREATE TRIGGER权限的用户。

SQL>AUDIT CREATE TRIGGER;

(3)对象审计:审计一个特定对象的使用情况。

例8-31 审计在CUSTOMER表上执行的SELECT语句。

SQL>AUDIT SELECT ON CUSTOMER;

3.数据库审计的步骤

执行数据库审计的步骤如下。

(1)首先设置初始化参数文件中的AUDITTRAIL参数,使得数据库的审计生效。该参数的值可以是下列三个值之一。

DB(或TRUE):审计生效,将审计记录插入到数据库审计表(SYS.AUD$)中。

OS:审计生效,将审计记录插入到操作系统审计文件中(假如操作系统允许审计的话),而不是将它们插入到SYS.AUD$审计表中。

NONE(或FALSE):审计失效(这是默认值)。

(2)用AUDIT命令指定需要审计的语句、对象或权限。

(3)用户执行PL/SQL和SQL语句时,服务器决定正在执行的语句是否应该产生一条审计记录。

(4)生成和插入一条审计记录到审计表中。

(5)通过查看审计记录,观察和监视有疑问的活动。