11.2 用户权限的管理

Oracle数据库对用户的权限有着严密的规定,如果没有权限,用户将无法完成任何操作,甚至不能登录数据库。例如,刚刚创建的用户user1在试图登录数据库时,将看到以下错误信息:


ORA-01045:user USER1 lacks CREATE SESSION privilege;logon denied


也就是说,用户若要登录数据库,必须具有CREATE SESSION权限。用户权限有两类,即系统权限和对象权限。系统权限主要是指对数据库对象的创建、删除、修改的权限,对数据库进行创建、备份等权限,而对象权限主要是指对数据库对象中的数据的访问权限。系统权限一般由sys用户指定,也可以由具有特权的其他用户授予。对象权限一般由数据库对象的所有者授予用户,也可以由sys用户指定,或者由具有该对象权限的其他用户授予。

11.2.1 系统权限的管理

系统权限是与数据库安全有关的最重要的权限,这类权限一般是针对数据库管理员的。系统权限的管理主要包括权限的分配、回收和查询等操作。Oracle 11g提供了200余种系统权限,表11.1列出了与用户有关的最重要的几种系统权限。

figure_0297_0094

对于表、视图、会话、用户、触发器这些数据库对象,有关的系统权限包括创建、删除和修改它们的权限,相关的命令分别是CREATE、DROP和ALTER。表、视图、触发器、存储程序等对象是与用户有关的,在默认情况下对这些对象的操作都是在当前用户自己的模式下进行的。如果要在其他用户的模式下操作这些类型的对象,需要具有对应的ANY权限。例如,要能够在其他用户的模式下创建表,当前用户必须具有CREATE ANY TABLE系统权限,如果希望能够在其他用户的模式下删除表,必须具有DROP ANY TABLE系统权限等。

系统权限一般有三种授予者,一种是sys用户,即数据库管理员,这是最主要的一种授予者,大部分的系统权限管理工作都由sys用户完成。第二种是具有特权的普通用户,普通用户一旦具有了sysdba或者sysoper特权,也可以管理系统权限。第三种是被授予了某种系统权限的用户,系统允许它把所拥有的系统权限再授予其他用户。

为用户授予权限的GRANT命令的语法格式为:


GRANT 权限1,权限2,……

TO用户1,用户2,……

WITH ADMIN OPTION;


GRANT命令执行后,所有指定用户都将获得指定的权限。如果希望把一个权限授予所有用户,可以用PUBLIC代替所有的用户名。选项“WITH ADMIN OPTION”的功能是使得权限的获得者可以再将权限授予其他用户。

例如,刚刚创建用户user1时,这个用户没有任何权限。如果把CREATE SESSION权限授予这个用户,那么这个用户就可以登录数据库了。如果再把CREATE TABLE权限授予这个用户,那么他就可以在自己的模式中创建表了。授予这两个权限的语句为:


GRANT CREATE SESSION, CREATE TABLE TO user1;


用户在登录数据库系统后应该可以创建表了,但是当这个用户在自己的模式中创建表时,将遇到以下的错误:


ORA-01950:表空间'SYSTEM'中无权限


出错的原因是当前用户在他的默认表空间中没有空间配额,即没有可以使用的存储空间,所以无法创建表。这时需要为该用户指定空间配额,或者为这个用户指定UNLIMITED TABLESPACE系统权限。所以为了使一个用户可以操作数据库,至少应该把上述三个权限授予这个新用户。例如,下列的授权语句使得所有用户都可以使用无限制的磁盘空间:


SQL>GRANT UNLIMITED TABLESPACE TO PUBLIC;


如果将ALTER USER的系统权限授予某用户,那么它就可以修改其他用户的信息。现在考察下列权限操作的语句序列:


SQL>CONN sys/1234 AS sysdba;

SQL>GRANT ALTER USER TO user1;

SQL>CONN user1/1234;

SQL>ALTER USER scott IDENTIFIED BY"hello";


如果上述语句都执行成功,那么用户scott的口令将被修改为“hello”。首先以特权用户sys登录,并将系统权限ALTER USER授予用户user1。然后以用户user1登录,这个用户就可以修改其他用户的信息了。

回收系统权限的命令是REVOKE,这条命令一般由SYS用户执行。普通用户如果要回收其他用户的权限,则他必须具有“GRANT ANY PRIVILEGE”这个系统权限。如果一个用户在接受某个系统权限时是以“WITH ADMIN OPTION”方式接受的,他随后又将这个系统权限授予了其他用户,那么他也可以将这个系统权限从其他用户回收。REVOKE的语法格式为:


REVOKE 系统权限1,系统权限2……

FROM 用户1,用户2……


如果要从所有用户回收某个系统权限,可以用PUBLIC代替所有的用户名。例如,要将刚才授予用户user1的系统权限CREATE SESSION和CREATE TABLE回收,可以执行下面的REVOKE语句:


SQL>REVOKE CREATE SESSION, CREATE TABLE FROM user1;


这样,用户USER1就不能登录数据库,更不能创建表了。

需要注意的是,系统权限可以转授,但是回收时不能间接回收。假设有三个用户,第一个用户将某个系统权限以“WITH ADMIN OPTION”的方式授予第二个用户,第二个用户又将这个权限授予第三个用户,那么当第一个用户从第二个用户回收这个权限时,并不能同时从第三个用户回收这个权限,第三个用户这时仍然具有这个权限。现在考虑下列权限操作的语句序列:


SQL>CONN sys/1234 AS sysdba

SQL>GRANT CREATE SESSION, CREATE TABLE TO user1 WITH ADMIN OPTION;

SQL>CREATE USER user2 IDENTIFIED BY"1234";

SQL>CONN user1/1234

SQL>GRANT CREATE SESSION, CREATE TABLE to user2;

SQL>CONN sys/1234 AS sysdba

SQL>REVOKE CREATE SESSIOIN, CREATE TABLE FROM user1;

SQL>CONN user2/1234

SQL>SELECT*FROM user_sys_privs;


假设上面的语句都执行成功,最后一条语句的执行结果为:


USERNAME PRIVILEGE ADM

USER2 CREATE TABLE NO

USER2 CREATE SESSION NO


现在我们解释一下这些语句的执行过程。首先以特权用户sys登录数据库,将两个系统权限授予用户user1,然后创建用户user2。接着以user1登录,将这两个权限转授予用户user2。这时用户user2就可以登录数据库了。接着再以用户sys登录,并从用户user1回收这两个系统权限。按照前面的说法,这两个权限并没有从用户user2回收,所以最后仍然能以user2用户登录数据库。经用户user2查询数据字典user_sys_privs,结果表明该用户仍然具有这两个权限。要回收这种转授的权限,可以由sys用户或者权限授予者直接从权限的接受者回收。