1、第 1 章 数据库用户管理【学习目标】Oracle 数据库用户是数据库安全机制的一种。本章主要内容是介绍 Oracle 数据库用户、模式(Schema)的概念,数据库用户的身份验证机制,以及如何创建和管理数据库用户。【本章要点】 创建数据库用户 修改和删除数据库用户 获取数据库用户信息【关键术语】Schema 模式 Quota 配额Database authentication 数据库验证 Operating system authentication 操作系统验证1.1 用户与安全1.1.1 数据的安全访问Oracle 数据库的安全包括在对象级控制数据库访问和使用的机制,这是通过数据库用户来
2、实现的,数据库用户是定义在数据库中的一个名称,它是存取数据库中信息的通道,是 Oracle 数据库的基本访问控制机制。数据安全策略决定哪个用户访问特定模式对象,在对象上允许每个用户的特定类型操作。用户在访问 Oracle 数据库时必须提供一个数据库帐户,只有合法身份的用户才能够访问数据库。在 Oracle 数据库中,每个数据库用户有一系列安全属性,见图 13-1。帐户锁定表空间配额临时表空间默认表空间角色权限资源限制用户安全属性直接权限认证机制图13-1 用户安全属性各个属性的含义如下: 认证机制:指明用户连接到数据库时的身份验证方式。 帐户锁定:指明用户是否被锁定,当用户被锁定后,该用户将无
3、法连接到数据库。 默认表空间:当用户创建数据库对象时,如果没有显式地指定对象所处的表空间,Oracle 把对象存放在用户的默认表空间中。 临时表空间:用户的一些操作(如排序)需要存放临时数据的地方,Oracle 将把临时数据存放到用户的临时表空间中。 表空间配额:指明用户在某个表空间中所能使用的存储空间大小。 资源限制:每个用户有一个唯一的概要文件,在文件中设置了用户的资源限制和口令策略。 直接权限:直接分配给用户的权限。 角色权限:权限不是直接分配给用户的,而是先分配给角色,然后把角色再分配给用户,这是用户获取权限的另一种方式。为了防止数据库用户未经授权使用,每个用户在连接到数据库时都需要进
4、行身份验证,Oracle 提供了三种身份验证方式: 数据库验证 操作系统验证 网络验证数据库验证表示用户名和口令的验证由 Oracle 完成,用户在连接数据库时必须同时提供用户名和口令。采用数据库验证具有以下一些优点: 用户帐户及其身份验证信息全部存储在数据库中,验证由 Oracle Server 完成,而不需要借助数据库外的任何控制。 当使用数据库验证时,Oracle 提供了严格的口令管理特征以加强口令的安全性,例如帐户锁定、口令有效期以及口令长度、复杂度等。 易于管理。操作系统验证也是一种常用的验证方式,在操作系统验证方式下,Oracle 将使用操作系统自身的验证机制来判断用户的身份。网络
5、验证指口令管理和用户验证由网络服务完成,如 Oracle Advanced Networking Option。身份验证方式是在创建用户时确定的,可以根据需要随时修改验证方式。本书只介绍数据库验证和操作系统验证的用户的管理。1.1.2 数据库模式对象模式是一系列对象的集合。一个模式只能够被一个数据库用户所拥有,并且模式的名称与这个用户的名称相同。ORACLE 数据库中的每个用户都拥有一个唯一的模式,他所创建的所有模式对象都保存在自己的模式中。模式对象的类型有表、索引、簇、触发器、PL/SQL、序列、同义词、视图、存储过程和存储函数等,当然,Oracle 中并不是所有的对象都是模式对象,非模式对
6、象有: 表空间 用户 角色 回滚段 概要文件当用户在数据库中创建一个模式对象后,这个模式对象默认地属于这个用户的模式。一个用户可以访问其模式的所有对象,但其它用户要访问另一个模式的对象时,必须在对象名前加上它所属的模式名。例如用户 SCOTT 检索其模式的表 EMP 时,可以直接执行语句:SELECT * FROM EMP;但是,如果要访问 SMITH 模式的 CLASS 表时,则必须执行语句:SELECT * FROM SMITH.CLASS。初学者在刚刚接触模式概念时,常常不清楚数据库用户与模式之间的区别。造成这种情况的原因是因为在 Oracle 数据库中,模式与数据库用户是一一对应,每个
7、数据库用户都拥有一个与他的用户名相同的模式。因此,在 Oracle 数据库中,模式与用户两个概念的差别很小,经常可以替换。例如“用户 A 拥有 TEMP 表”和“模式 A 拥有 TEMP 表”两句话的意义是相同的。因此不必在语言上完全区分模式与用户,但是,一定要清楚模式与用户是两个完全不同的概念。1.2 创建用户操作使用 CREATE USER 语句可以创建一个新的数据库用户,执行该语句的用户必须具有CREATE USER 系统权限。在创建用户之前,首先要确认这个用户的一些信息: 用户名称是什么? 该用户采用什么验证方式? 用户的缺省表空间和临时表空间是什么? 允许用户在表空间中使用多少空间配
8、额?使用 CREATE USER 语句创建用户的语法为:CREATE USER userIDENTIFIED BY password | EXTERNALLY DEFAULT TABLESPACE tablespace TEMPORARY TABLESPACE tablespace QUOTA integer K | M | UNLIMITED ON tablespace QUOTA integer K | M | UNLIMITED ON tablespace. PASSWORD EXPIRE ACCOUNT LOCK | UNLOCK PROFILE profile | DEFAULT 其
9、中:各参数说明如下: USER:用于指明用户名。 IDENTIFIED 用于指明验证方式。 BY password:指定用户在登录时需通过数据库验证,还必须提供口令 EXTERNALLY:指定用户需通过操作系统验证 GLOBALLY AS:指定对用户进行全局验证 DEFAULT TABLESPACE:用于指定用户的默认表空间。当用户建立数据对象(表、索引簇)时,如果不指定 TABLESPACE 子句,那么 Oracle 会自动在默认表空间上为这些数据对象分配空间。如果在建立用户时不指定 DEFAULT TABLESPACE子句,则会将 SYSTEM 表空间作为其默认表空间。 TEMPORARY
10、 TABLESPACE:用于指定用户的临时表空间。当该用户执行排序操作时,一些临时数据将会存放到临时表空间中。如果不指定该子句,将使用数据库的默认临时表空间(在创建数据库时指定) ,如果没有为数据库设置默认临时表空间,则会使用 SYSTEM 表空间作为用户的临时表空间,这种情况应当避免发生。 QUOTA:用于指定表空间配额,即用户对象可占用表空间的总计空间。分配配额时可以以 KB 或 MB 作为单位,也可以指定 UNLIMITED,表示配额不受限制。如果不指定配额,用户将无法使用表空间存放数据库对象。临时表空间不需要指定配额。 PASSWORD EXPIRE:强制用户在使用 SQL*Plus
11、登录到数据库时重置口令(该选项仅在用户通过数据库进行验证时有效) 。 ACCOUNT LOCK/UNLOCK:可用于显式锁定或解除锁定用户帐户(UNLOCK 为缺省设置) PROFILE:用于控制资源使用和指定用户的口令控制机制。下面介绍数据库验证和操作系统验证两种验证方式的用户的创建。1.2.1 创建数据库验证的用户我们知道数据库验证是使用数据库来检查用户、口令以及用户身份的方式,该方式是最常用的用户身份验证方式。如果要使用数据库验证,那么当建立用户时必须要为其提供口令,并且口令必须是单字节字符。【实例 13-1】创建一个数据库验证用户,同时为它指定口令、默认表空间、临时表空间、空间配额,并
12、要求他登录后更改口令。1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)创建用户SQLCREATE USER u01IDENTIFIED BY u123456DEFAULT TABLESPACE usersTEMPORARY TABLESPACE tempQUOTA 10M ON usersPASSWORD EXPIRE;用户已创建3)为用户授基本权限SQL GRANT CONNECT,RESOURCE TO u01;授权成功。4)使用新用户登录数据库SQL CONN u01/u123456ERROR:ORA-28001: the password has expir
13、ed更改 u01 的口令新口令:重新键入新口令:口令已更改已连接。说明:本例创建的新用户名为 u01,口令为 u123456,默认的表空间为 users,临时表空间为 temp。在 users 表空间上的空间使用配额为 10M。PASSWORD EXPIRE 指明用户首次登录后,要立即进行口令修改,修改口令时,需输入 2 次相同的新口令,口令修改过程中,不显示输入的口令。新用户创建后,不能立即登录到数据库,因为它还不具有 CREATE SESSION 权限。因此,在建立新用户后,要使用 GRANT 语句为它授予 CREATE SESSION 权限,该权限允许用户登录数据库,在本例中,授予用户
14、CONNECT 角色,该角色包含 CREATE SESSION 权限,有关内容参照以后的章节。【实例 13-2】创建数据库验证用户,同时为它指定口令、缺省表空间、临时表空间、空间配额,并设置该用户为锁定状态。1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)创建用户SQLCREATE USER u02IDENTIFIED BY u123456DEFAULT TABLESPACE usersTEMPORARY TABLESPACE tempQUOTA UNLIMITED ON indxQUOTA 1m ON usersACCOUNT LOCK;用户已创建3)为用户授基本
15、权限SQL GRANT CONNECT,RESOURCE TO u02;授权成功。4)使用新用户登录数据库SQL CONN u02/u123456ERROR:ORA-28000: the account is locked警告: 您不再连接到 ORACLE。5)以管理员身份重新登录SQLCONNECT / AS SYSDBA已连接。6)为账户解锁SQL ALTER USER u02 ACCOUNT UNLOCK;用户已更改。7)使用新账户登录数据库SQL CONN u02/u123456已连接。说明:其中有些参数的用法与例 13-1 一样,但要注意的是这里使用了 UNLIMITED 指明用户在
16、 indx 表空间上无配额限制,当然这种做法是不推荐的。本例还使用了 ACCOUNT LOCK 子句锁定了该用户,即用户已创建并获得登录权限,但仍然不能用它登录,直到把它解锁为止。【练习 13-1】创建一个新的表空间,创建数据库验证用户 u03,使用新的表空间作为默认表空间,并允许用户无限制使用该表空间。1.2.2 创建操作系统验证的用户除了数据库验证方式外,操作系统验证也是一种常用的认证方式。在操作系统验证方式下,Oracle 将使用操作系统自身的认证机制来判断用户的身份,不过,在这种情况下,仍然需要在数据库中建立用户,而且数据库中的用户必须要对应于某个操作系统用户。创建操作系统验证的用户的
17、语法与创建数据库验证的用户一样,只是把设置口令的IDENTIFIED BY 子句改为 IDENTIFIED EXTERNALLY。【实例 13-3】创建一个操作系统验证的用户 ops$u04。1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)创建用户SQLCREATE USER ops$u04IDENTIFIED EXTERNALLYDEFAULT TABLESPACE USERSTEMPORARY TABLESPACE temp;用户已创建其中 IDENTIFIED EXTERNALLY 用于指明操作系统验证的用户。如果用户在连接数据库时没有指定用户名,Oracle
18、 将会使用初始化参数OS_AUTHENT_PREFIX 的值和操作系统用户名自动生成一个用户名。OS_AUTHENT_PREFIX 的参数的默认值为 OPS$,如果当前登录操作系统的用户名为u04,则 Oracle 自动生成的用户名为 ops$u04。当操作系统用户 u04 用下面的语句连接数据库时:SQLconnect /Oracle 将在数据库中查找是否存在名为 ops$u04 的用户,如果存在,则以该用户的身份建立连接。也可把 OS_AUTHENT_PREFIX 的参数的值设为空:OS_AUTHENT_PREFIX=“1.3 其他用户操作1.3.1 修改用户在创建用户以后,可以使用 AL
19、TER USER 命令对用户进行修改,修改用户一般是由DBA 来完成的,如果要以其它用户身份修改用户,那么该用户必须具有 ALTER USER 系统权限。利用 ALTER USER 命令可以修改用户的各种信息,如口令、默认表空间、临时表空间、配额和概要文件等。【实例 13-4】用户 u2 修改自己的口令1)以用户 u2 登录SQLconnect u02/u123456已连接。2)修改用户口令ALTER USER u02 IDENTIFIED BY u654321;用户已更改。【实例 13-5】把用户 u02 在 USERS 表空间上的配额改为 01)以管理员身份登录SQLCONNECT / A
20、S SYSDBA已连接。2)修改配额SQLALTER USER u02QUOTA 0 ON USERS;用户已更改。u02 在 USERS 表空间上的配额改为 0 以后,将不能在 USERS 表空间上创建数据库对象了。读者不妨一试。【练习 13-2】对用户进行修改,要求用户 u02 登录后更改口令1.3.2 删除用户删除用户是使用 DROP USER 命令由 DBA 来完成的;如果要以其它用户身份删除用户,则要求该用户必须具有 DROP USER 系统权限。当删除了用户之后, Oracle 会从数据字典中删除用户、模式及其所有模式对象的信息。删除用户的语法如下:DROP USER user C
21、ASCADE参数 CASCADE 表示删除用户模式中包含的模式对象,如果要删除的用户模式中包含模式对象,必须带有该参数,否则会出现错误信息:ERROR 位于第 1 行:ORA-01922: 必须指定 CASCADE 以删除u01如果用户当前正连接到数据库,则不能删除该用户。必须先用 ALTER SYSTEM KILL SESSION 语句终止它的会话,然后再用 DROP USER 将用户删除。【实例 13-6】删除用户 csi1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)删除用户SQLDROP USER u01 CASCADE;用户已丢弃这样就把用户 u01 及其
22、它拥有的所有表、索引等模式对象一起删除了。1.3.3 监视用户当建立用户时,Oracle 会将用户信息存放到数据字典中。通过查询数据字典DBA_USERS,你可以显示用户的详细信息,包括用户名、帐户状态、默认表空间以及临时表空间等信息。DBA_TS_QUOTAS 数据字典视图可以显示用户的表空间配额信息。【实例 13-7】查询所有用户的默认表空间1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)查询信息SQL SELECT username, default_tablespace FROM dba_users;USERNAME DEFAULT_TABLESPACE-
23、-SYS SYSTEMSYSTEM SYSTEMSCOTT SYSTEMU02 USERSHR EXAMPLERMAN TOOLS已选择 35 行。【实例 13-8】 显示用户 aaron 的默认表空间和临时表空间信息1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)查询信息SQL SELECT default_tablespace,temporary_tablespaceFROM dba_users WHERE username=U02;DEFAULT_TABLESPACE TEMPORARY_TABLESPACE- -USERS TEMP表空间配额限制了用户在某个
24、表空间上可使用的最大空间。如果表空间配额不足,那么当在表空间上创建对象时经常会显示错误信息:ERROR 位于第 1 行:ORA-01536: 超出表空间USERS的空间限量你可以使用数据字典 dba_ts_quotas 定期监视用户空间配额。【实例 13-9】查看用户 scott 的表空间配额1)以管理员身份登录SQLCONNECT / AS SYSDBA已连接。2)查询信息SQLSELECT tablespace_name,blocks*100/max_blocks | % “已用空间百分比”FROM dba_ts_quotasWHERE username=SCOTT AND max_blo
25、cksCONNECT / AS SYSDBA已连接。2)授予权限SOLGRANT CREATE TABLE,CREATE VIEW to aaron; 授权成功。3)使用权限创建表SOLconnect aaronsoccer已连接。SOLcreate table t1(cola int, colb char(3);表已创建。SOLINSERT INTO t1 VALUES(1,A);已创建 1 行。SOLCOMMIT;提交完成。在将系统权限 CREATE TABLE 授予用户 aaron 之后,该用户就可以执行建表操作了。【实例 14-2】授予 aaron 用户创建存储过程的权限1)以管理员身
26、份登录SOLCONNECT / AS SYSDBA已连接。2)授予权限SOLGRANT CREATE PROCEDURE to aaron;授权成功。【练习 14-1】授予用户 devp 连接数据库和创建表的权限Oracle 中有两个特殊权限:SYSDBA 和 SYSOPER,具有该权限的用户能执行数据库维护操作,例如启动和关闭 Oracle Server、建立数据库、备份和恢复等任务。当将初始化参数 REMOTE_LOGIN_PASSWORDFILE 设置为 EXCLUSIVE 时,你还可以将 SYSDBA 和 SYSOPER 特权授予其它用户,这样该用户就会在口令文件中出现,并能进行启动和
27、关闭实例等数据库维护操作。例如:C:sqlplus nologSOLCONN AS SYSDBA已连接。SOLGRANT SYSDBA to aaron;授权成功。SOLCONN aaron/soccer AS SYSDBA;已连接。SOLSHUTDOWN需要注意,有特殊权限 SYSDBA 或 SYSOPER 的用户在登录时必须带有 AS SYSDBA或 AS SYSOPER 子句。权限 SYSDBA 自动包含了 SYSOPER 的所有权限,另外还具有建立数据库以及执行不完全恢复的权限,而 SYSOPER 则不能执行这两项操作。表 14-2 给出了 SYSDBA 和 SYSOPER 的区别。表
28、 14-2 SYSDBA 和 SYSOPER 的区别权限 区别STARTUPSHUTDOWNALTER DATABASE OPEN | MOUNTALTER DATABASE BACKUP CONTROLFILE TORECOVER DATABASEALTER DATABASE ARCHIVELOGSYSOPERRESTRICTED SESSIONSYSOPER PRIVILEGES WITH ADMIN OPTIONCREATE DATABASEALTER TABLESPACE BEGIN/END BACKUPRESTRICTED SESSIONSYSDBARECOVER DATABASE
29、UNTIL2系统权限回收回收系统权限是使用 REVOKE 命令来完成的。在收回了用户所具有的系统权限之后,用户将不能执行该系统权限所对应的 SQL 命令。收回系统权限一般是由 DBA 用户来完成的,但如果要以其他用户身份收回系统权限,那么要求用户必须具有 GRANT ANY PRIVILEGE 系统权限或转授系统权限的选项 WITH ADMIN OPTION。【实例 14-3】回收用户 aaron 的创建表的权限。1)以管理员身份登录SOLCONNECT / AS SYSDBA已连接。2)回收权限SOLREVOKE CREATE TABLE FROM aaron;撤销成功。当回收用户 aaro
30、n 的 CREATE TABLE 系统权限之后,该用户将不能创建表了。读者可以试一下。【练习 14-2】回收用户 aaron 的创建存储过程的权限。2.2.4 系统权限的传递在使用 GRANT 授权时可以带有 WITH ADMIN OPTION 参数,表明得到权限的用户可以把该权限再授给其它用户。【实例 14-4】授予用户 aaron 有创建存储过程的权限,要求带 WITH ADMIN OPTION参数。1)以管理员身份登录SOLCONNECT / AS SYSDBA已连接。1)管理员授予系统权限,并允许传递SOLGRANT CREATE PROCEDURE to aaronWITH ADMI
31、N OPTION;授权成功。2)以 aaron 用户登录,授予用户 devp 创建存储过程的权限SOLCONNECT aaron/soccer已连接。SOLGRANT CREATE PROCEDURE to devp;授权成功。3)创建存储过程SOLconnect devp /development已连接。SOL CREATE OR REPLACE PROCEDURE pp2 AS3 BEGIN 4 DBMS_OUTPUT.PUT_LINE(成功了!);5 END;6 /过程已创建因为 aaron 在得到创建存储过程的权限时带有了 WITH ADMIN OPTION 参数,所以它也可以把该权限
32、授予其它用户。这样用户 devp 也具有了创建存储过程的权限。例如:大家需要注意,系统权限在回收时不会被级联回收。在前面的例子中,DBA 授予用户aaron 具有 CREATE PROCEDURE 系统权限,用户 aaron 又把 CREATE PROCEDURE 系统权限授予了 devp 用户,图 14-1 示意性地给出了授权过程。DBA aaron devpCREATE PROCEDURE CREATE PROCEDURE CREATE PROCEDURE图 14-1 当 DBA 收回 aaron 的 CREATE PROCEDURE 系统权限时,不会收回 devp 的系统权限,因为系统权
33、限不会被级联收回。如图 14-2 所示。DBA aaron devpCREATE PROCEDURE CREATE PROCEDURE图 14-2【实例 14-5】回收用户 aaron 的创建存储过程的权限。1)以管理员身份登录SOLCONNECT / AS SYSDBA已连接。2)回收权限SOLREVOKE CREATE PROCEDURE FROM aaron;撤销成功。3)创建存储过程SOLconnect devp/development已连接。SOL CREATE OR REPLACE PROCEDURE ppASBEGIN DBMS_OUTPUT.PUT_LINE(成功了!);END
34、;/过程已创建当 DBA 收回了 aaron 的 CREATE PROCEDURE 系统权限后,用户 devp 仍然具有CREATE PROCEDURE 系统权限。2.2.5 利用控制台管理系统权限1以独立方式启动控制台,连接到要管理的数据库。展开数据库中的“安全性”项目,然后选中其中的“用户”选项,如图 14-3。图 14-3 控制台中的数据库用户信息2在对话框中双击要授权的用户,选中“系统”选项卡,然后选中要授予或回收的权限用箭头进行授予或回收权限,还以设置管理选项,相当于命令方式的 WITH ADMIN OPTION 参数,如图 14-4。图 14-4 授予或回收系统权限3完成设置后,单
35、击“确定”按钮。2.3 对象权限管理2.3.1 对象权限划分对象权限是指访问其他模式对象的权利,它用于控制一个用户对另一个用户的访问。模式对象的创建者具有该对象的所有对象权限,并且能够将这些对象权限授予数据库中其它用户。例如,如果 SMITH 用户希望可以访问 SCOTT 模式的对象 EMP 表,则必须要在 EMP表上具有相应对象权限。因为 SCOTT 用户是 EMP 的创建者,所以 SCOTT 用户可以将EMP 表的访问权限授予 SMITH 用户。在 Oracle 中,一共有八种类型的对象权限,表 14-3 列出了 Oracle 所提供的所有对象权限。在使用对象权限时,有几点需要注意: 对象
36、权限可以授予用户、角色和 PUBLIC 公共用户组。 默认情况下,当直接授予对象权限时,会将访问所有列的权限都授予用户。而如果你只允许用户访问某些列,则必须要授予列权限。需要注意,只能在INSERT、UPDATE 和 REFERENCES 上授予列权限。 SELECT 对象权限不能授予列,因此,如果希望用户只能查询表中的某些列,唯一的方法是为表创建视图,然后将视图的 SELECT 权限授予用户。表 14-3 所有对象权限对象权限 表 视图 序列 过程ALTER DELETE EXECUTE INDEX INSERT REFERENCES SELECT UPDATE 2.3.2 授予和回收对象权
37、限1对象权限授予用户可以访问其模式中的所有对象,但如果一个用户要访问另一个模式的对象时,则必须要具有对象权限。例如,如果 SMITH 用户希望检索 SCOTT 模式的 EMP 表,则需要在 EMP 表上具有 SELECT 对象权限。授予对象权限是使用 GRANT 命令来完成的,一般情况下对象权限是由对象的创建者来授予的,如果要以其它用户身份授予对象权限,那么该用户在获得相应对象权限时必须带有 WITH GRANT OPTION 选项。使用 GRANT 授予对象权限的语法如下:GRANT object_privilege (column_list) , object_privilege (col
38、umn_list) .|ALL PRIVILEGESON schema.objectTO user | role | PUBLIC, user|role | PUBLIC .WITH GRANT OPTION其中,object_privilege:表示要授予的对象权限。column_list:是一个表或视图的列,用于授予列权限。ALL:将所有对象权限授予用户。WITH GRANT OPTION:允许得到权限的用户把权限再授给其它用户。【实例 14-6】 SCOTT 用户把 EMP 表的查询权限授予 aaron 用户1)以 SCOTT 用户登录,授予对象权限SOLCONNECT scott/ti
39、ger已连接。2)SCOTT 授予 aaron 对象权限SOLGRANT SELECT ON emp to aaron;授权成功。3)aaron 查询 SCOTT 的表SOLconnect aaron/soccer已连接。SOLSELECT * FROM SCOTT.EMP;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO- - - - - - -7369 SMITH CLERK 902 17-12 月-80 800 207499 ALLEN SALESMAN 7698 20-2 月-81 1600 300 307521 WARD SALESMAN 76
40、98 22-2 月 -81 1250 500 307566 JONES MANAGER 7839 02-4 月 -81 2975 20 已选择 4 行。权限授予以后,aaron 用户就能查询 EMP 表了。【实例 14-7】 SCOTT 用户把 EMP 表的 empno 和 ename 列的插入和更新权限授予aaron 用户。1)以 SCOTT 用户登录SOLCONNECT scott/tiger已连接。2)SCOTT 用户授予 aaron 列权限SOLGRANT INSERT(empno,ename),UPDATE(empno,ename) ON EMP to aaron;授权成功。3)aa
41、ron 插入数据到 SCOTT 的 emp 表SOLconnect aaron/soccer已连接。SOLINSERT INTO SCOTT.EMP(empno,ename) VALUES(7901,Alex);已创建 1 行。注意:这里授予的是列权限,这样 aaron 用户将只能在 empno 和 ename 两列上执行INSERT 和 UPDATE 操作。列权限只能在 INSERT、UPDATE 和 REFERENCES 上授予。一个用户如果有建表的权限,那么它可以自动在该表上建立索引。但如果一个用户要在另一个用户表上建立索引,则必须要具有 INDEX 对象权限。【实例 14-8】为了使得
42、用户 devp 可以在 SYSTEM 的 TEMP 表建立索引,就必须授予INDEX 对象权限。1)以 SYSTEM 用户登录 SOLCONNECT system/manager已连接。2)授权SOLGRANT INDEX ON TEMP to devp;授权成功。3)创建索引SQLconnect devp/development已连接。SQLCREATE INDEX idx1 ON system.temp(colb);索引已创建。当将 SYSTEM.TEMP 表上的 INDEX 对象权限授予用户 devp 之后,用户 devp 就可以基于表 TEMP 建立索引了。一个用户可以在其模式表之间建
43、立主外键关系,例如用户 SCOTT 可以在其表DEPT、EMP 之间指定主外键关系。但如果在不同用户表之间建立主外键关系,则必须要将主表上的 REFERENCES 对象权限授予从表所对应的用户。【实例 14-9】devp 用户要基于表 SYSTEM.TEMP 建立从表,则必须要被授予REFERENCES 对象权限。1)以 SYSTEM 用户登录SQLconnect system/manager已连接。2)授权SQLGRANT REFERENCES ON temp TO devp;授权成功。3)创建外键SQLconnect devp/development已连接。 SQLCREATE TABLE
44、 tempi(2 cola int REFERENCES system.temp(cola);表已创建。当将表 SYSTEM.TEMP 上的 REFERENCES 对象权限授予用户 devp 之后,devp 用户就可以建立基于表 TEMP 的外部键约束了。【练习 14-3】devp 用户授予用户 aaron 具有执行存储过程 PP 的权限。2对象权限回收回收对象权限也是使用 REVOKE 命令来完成的。在收回了用户所具有的对象权限之后,用户将不能执行该对象权限所对应的 SQL 命令。回收对象权限一般是由对象创建者(所有者)来完成的,但如果要以其他用户身份收回对象权限,那么要求用户必须具有对象权
45、限及 WITH GRANT OPTION 选项。【实例 14-10】回收用户 aaron 的 EMP 表的查询权限。1)以 SCOTT 用户登录SOLCONNECT scott/tiger已连接。2)回收权限SOLREVOKE SELECT ON EMP FROM aaron;撤销成功。3)回收权限后,查询出错SQLconnect aaron/soccer已连接。SQLSELECT * FROM scott.emp;ERROR 位于第 1 行:ORA-00942: 表或视图不存在当收回 aaron 用户的 SELECT 对象权限之后,该用户将不能查询 SCOTT.EMP 表。【练习 14-4】
46、回收用户 devp 在 SYSTEM.TEMP 表上创建索引的权限2.3.3 对象权限的传递关系在使用 GRANT 授权时可以带有 WITH GRANT OPTION 参数,表明得到权限的用户可以把该权限再授给其它用户。【实例 14-12】使用 WITH GRANT OPTION 参数,进行传递授权。1)以 SCOTT 用户登录SOLCONNECT scott/tiger已连接。2)授予 aaron 对象权限SOLGRANT ALTER ON EMP to aaronWITH GRANT OPTION;授权成功。3)以 aaron 用户登录SOLCONNECT aaron/soccer已连接。
47、4)授予 devp 对象权限SOLGRANT ALTER ON SCOTT.EMP to devp;授权成功。因为 aaron 在得到权限时带有了 WITH GRANT OPTION 参数,所以它也可以把该权限授予其它用户。需要注意,在授予对象权限时带的 WITH GRANT OPTION 选项只能被授予用户,而不能被授予角色。我们知道,系统权限在回收时不会被级联收回,但对象权限会被级联收回。在前面进行授权时,SCOTT 用户将 EMP 表上的 ALTER 对象权限和 WITH GRANT OPTION 选项授予了用户 aaron,用户 aaron 又将 SCOTT.EMP 表上的 ALTER
48、 对象权限授予了用户 devp,图 14-5 示意性地给出了前面例子的授权过程。当用户 SCOTT 回收了 aaron 在 SCOTT.EMP 表的 ALTER 对象权限时,同时也会回收用户 devp 在该表上的 ALTER 权限,如图 14-6 所示。一般情况下,回收对象权限都是由对象所有者来完成的。【实例 14-13】 验证对象权限的级联回收。1)以 SCOTT 用户登录SOLCONNECT scott/tiger已连接。2)回收权限SOLREVOKE ALTER ON EMP FROM aaron;撤销成功。3)回收权限后,修改表出现错误。SQLconnect devp/development已连接。SQLALTER TABLE SCOTT.EMP ADD n