11.2.2 对象权限的管理

对象权限主要是对数据库对象中的数据的访问权限,这类权限主要是针对普通用户的。表11.2列出了最主要对象权限。

figure_0299_0095

SELECT、INSERT、DELETE和UPDATE权限分别是指对数据库对象中的数据的查询、插入、删除和修改的权限。对于表和视图来说,查询和删除操作是整行进行的,而插入和修改却可以在一行的某个列上进行,所以在指定权限时,SELECT和DELETE权限只要指定所要访问的表就可以了,而INSERT和UPDATE权限还可以进一步指定是对哪个列的权限。

REFERENCES权限是指可以与一个表建立关联关系的权限,如果具有了这个权限,当前用户就可以通过自己的一个表中的外键,与对方的表建立关联。关联关系是通过主键和外键进行的,所以在授予这个权限时,可以指定表中的列,也可以不指定。

EXECUTE权限是指可以执行存储函数、存储过程和程序包的权限。有了这个权限,一个用户就可以执行另一个用户的存储程序。

当一个用户获得另一个用户的某个对象的访问权限后,以“用户名.对象名”的形式访问这个数据库对象。一个用户所拥有的对象和可以访问的对象是不同的,这一点在数据字典视图中也有所反映。在默认情况下用户可以直接访问自己模式中的数据库对象,但是要访问其他用户所拥有的对象,就必须具有相应的对象权限。例如,用户user1要查询用户scott的表emp中的数据,就必须具有对表emp的SELECT权限。从数据字典视图user_objects中可以获得当前用户所拥有的全部数据库对象的信息,而从数据字典视图all_objects中则可以获得当前用户所能访问的全部对象的信息。

对象权限的授予一般由对象的所有者完成,也可以由sys用户,或者由具有某对象权限的用户授予,但最好由对象的所有者完成。授予对象权限的命令是GRANT,回收权限的命令是REVOKE,与系统权限的操作相比,这两条命令有些不同的地方。授予对象权限的GRANT命令语法格式为:


GRANT对象权限1(列名),对象权限2(列名)……

ON对象TO用户1,用户2……

WITH GRANT OPTION;


在授予对象权限时,不仅要说明是什么权限,还要指定是对哪个对象的访问权限,这是与系统权限的授予不同的地方。例如,假设当前用户是scott,下面的语句将表emp的SELECT权限授予用户user1和user2:


SQL>GRANT SELECT ON emp TO user1,user2;


如果要将某个对象权限授予所有用户,可以用PUBLIC代替所有的用户名。用户访问其他用户的对象时,需要用对方的用户名限定对象。例如,用户user1访问emp表的语句为:


SELECT empno, ename, sal FROM scott.emp;


如果没有SELECT权限,用户在查询其他用户的一个表时,将遇到“ORA-00942:表或视图不存在”这样的错误。

如果在为用户指定某个对象权限时使用了“WITH GRANT OPTION”选项,那么这个用户在接受了这个权限后,可以再将这个权限授予其他的用户。假设当前用户是scott,考察下面的权限操作语句:


SQL>GRANT SELECT ON dept TO user1 WITH GRANT OPTION;

SQL>CONN user1/1234

SQL>GRANT SELECT ON scott.dept TO user2;

SQL>CONN user2/1234

SQL>SELECT*FROM scott.dept;


如果上面的语句都执行成功,最后一条语句将显示dept表中的数据。首先用户scott将表dept上的SELECT权限以“WITH GRANT OPTION”的方式授予用户user1。然后以用户user1登录,再将这个权限授予用户user2。最后以用户user2登录,这时就可以查询用户scott的dept表中的数据了。

对于INSERT和UPDATE两个对象权限,还可以进一步指定是在表中的哪个列上具有访问权限,也就是说,可以规定其他用户可以对表中的哪个列进行插入和修改操作。例如,假设当前用户是scott,下面的语句将表emp中对列empno的插入权限和sal列的修改权限授予用户user1和user2:


SQL>GRANT INSERT(empno),UPDATE(sal)ON emp TO user1,user2;


这样用户user1和user2就可以对表emp的列empno进行插入访问,对sal列进行修改访问,而对其他列没有任何访问权限。

EXECUTE权限是指可以执行一个用户所拥有的存储函数、存储过程和程序包的权限,假设当前用户创建了一个存储函数function1,通过下面的语句可以把对这个函数的执行权限授予用户user1;


SQL>GRANT EXECUTE ON function1 TO user1;


REFERENCES权限是指其他用户的表可以与当前用户的表建立关联关系的权限。假设当前用户有一个表,在这个表的某个列上建立了主键约束。如果把这个表的REFERENCES权限授予其他用户,那么其他用户就可以通过外键将自己的表与这个表建立关联关系,也就是可以引用这个表中的主键列的值。假设当前用户是scott,在表dept的deptno列上建立了主键约束。假设用户scott要将表dept上的deptno列的REFERENCES权限授予用户user1,可以执行下面的GRANT语句:


SQL>GRANT REFERENCES(deptno)ON dept TO user1;


这样用户user1就可以创建一个表,在表上指定一个外键,并且与表dept上的deptno列建立关联关系,或者修改一个已经存在的表,在表上指定一个外键,同样可以建立这种关联关系。例如:


CREATE TABLE sample(

deptno number REFERENCES scott.dept(deptno)

……);


回收对象权限的命令是REVOKE。一般回收对象权限的操作由权限的授予者完成。这条命令的语法格式为:


REVOKE 对象权限1,对象权限2……ON对象

FROM 用户1,用户2……


如果要回收与某个数据库对象有关的所有对象权限,可以用ALL代替权限列表。例如,用户scott要从用户user1回收对表emp的所有权限,可以执行下面的REVOKE语句:


SQL>REVOKE ALL ON emp FROM user1;


如果要从所有用户回收某个对象权限,可以用PUBLIC代替所有用户的名称。

需要注意的是,权限INSERT、UPDATE和REFERENCES在分配时可以指定相关的列,但是在回收时不能指定列,而只能指定表名。例如,用户scott要从用户user2回收对表emp中sal列上的UPDATE权限,下面的语句是错误的:


SQL>REVOKE UPDATE(sal)ON emp FROM user2;


正确的语句应该是:


SQL>REVOKE UPDATE ON emp FROM user2;


如果某个对象权限是以“WITH GRANT OPTION”方式授予一个用户的,那么这个用户可以将这个权限再授予其他用户。在从这个用户回收对象权限时,也将同时从其他用户回收,这一点也是与系统权限不同的。例如,假设当前用户scott将表emp的SELECT权限以“WITH GRANT OPTION”方式授予了用户user1,user1又将这个权限授予了用户user2,那么当用户scott从用户user1回收这个权限时,同时将这个权限从用户user2回收。