授予用户系统权限
要授予用户系统权限需要使用GRANT指令的SQL语句,被授予了权限的用户在一定授权下可以继续将系统权限赋予其他用户。下面是赋予用户权限的语法格式。
GRANT { system_privilege | role }
[, { system_privilege | role } ] ……
TO { user | role | PUBLIC }
[, { user | role | PUBLIC } ] ……
[ WITH ADMIN OPTION ]
如上所示整个授权的框架是:GRANT系统权限TO用户[WITH ADMIN OPTION]。如果有多个系统权限使用逗号隔开,如果有多个用户也用逗号隔开。在上述语法格式中符号“|”表示“或”的关系。
下面通过例子演示如何向用户授权。首先,我们创建一个用户JNAE。
例子19-1 创建新用户JANE
SQL> create user jane
2 identified by abc119#;
用户已创建。
注意
例子19-1中的密码有点奇怪,因为我们使用了verify_function密码复杂性验证函数,且更改了用户的默认密码概要文件,所以这里的密码要符合设置的规则。
对于一个新创建的数据库用户,它不具有任何权限,如果此时使用该用户连接数据库则无法成功,如例子19-2所示。
例子19-2 使用新用户JANE连接数据库
SQL> connect jane/abc119#@orcl
ERROR:
ORA-01045: user JANE lacks CREATE SESSION privilege; logon denied
警告: 您不再连接到ORACLE。
该例子说明用户JNAE没有CREATE SESSION的系统权限,所以登录被拒绝了。下面我们将CREATE SESSION、CREATE TABLE、SELECT ANY TABLE的权限赋予用户,此时必须以SYSTEM用户登录。
例子19-3 赋予用户权限
SQL> grant create session,create table,select any table to jane;
授权成功。
现在用户JANE具有了建立数据库会话、创建表以及查看任何表的系统权限,下面通过数据字典DBA_SYS_PRIVS查看被授权的用户的权限信息。
例子19-4 查看用户JANE的拥有的系统权限
SQL> conn system/oracle@orcl
已连接。
SQL> col grantee for a10
SQL> col privilege for a25
SQL> select *
2 from dba_sys_privs
3* where grantee = 'JANE'
GRANTEE | PRIVILEGE | ADM |
--------- | --------- | --------- |
JANE | SELECT ANY TABLE | NO |
JANE | CREATE TABLE | NO |
JANE | CREATE SESSION | NO |
从输出可以看出用户JANE具有了3个系统权限,即SELECT ANY TABLE、CREATE TABLE和CREATE SESSION。而ADM列的值都为NO,说明用户JANE拥有的权限不能再赋予其他用户。为了验证整个问题,我们再创建一个新用户LARRY。
例子19-5 创建用户LARRY
SQL> create user larry
2 identified by abc119#;
用户已创建。
新用户创建成功,我们使用数据字典DBA_SYS_PRIVS查看该用户的系统权利是不是“一穷二白”。
例子19-6 查看用户LARRY的系统权限
SQL> select *
2 from dba_sys_privs
3 where grantee = 'LARRY';
未选定行
显然,用户LARRY目前还不具有任何系统权限,下面我们尝试使用JANE用户登录并将CREATE SESSION和SELECT ANY TABLE的权限赋予用户LARRY。
例子19-7 用户JANE赋予用户LARRY系统权限
SQL> connect jane/abc119#@orcl
已连接。
SQL> grant create session,select any table to larry;
grant create session,select any table to larry
*
第1行出现错误:
ORA-01031: 权限不足
发生错误,说明权限不够,用户JANE无法向用户LARRY授权。读者还记得在例子19-4中用户JANE的ADM列的值都为NO,所以无法继续授权给其他用户。下面我们修改用户JANE的权限使得它具有继续授权给其他用户的权利。先回收用户权限。
例子19-8 回收用户JANE的所有权限
SQL> connect system/oracle@orcl
已连接。
SQL> revoke create session,select any table,create table from jane;
撤销成功。
下面重新授予用户JANE这些权利,并带有WITH ADMIN OPTION选项,如例子19-9所示。
例子19-9 赋予用户JANE系统权限并允许继续授权
SQL> grant create session,select any table,create table to jane
2 with admin option;
授权成功。
为了验证WITH ADMIN OPTION的参数设置效果,我们继续使用数据字典DBA_SYS_PRIVS。
例子19-10 查看用户JANE的系统权限信息
SQL> select *
2 from dba_sys_privs
3 where grantee ='JANE';
GRANTEE | PRIVILEGE | ADM |
--------- | --------- | --------- |
JANE | SELECT ANY TABLE | YES |
JANE | CREATE TABLE | YES |
JANE | CREATE SESSION | YES |
此时用户JANE系统权限的ADM列的值都为YES,说明这些权限可以继续赋予其他用户。下面将用户JANE的CREATE SESSION和SELECT ANY TABLE赋予用户LARRY。
例子19-11 用户JANE赋予用户LARRY系统权限
SQL> connect jane/abc119#@orcl
已连接。
SQL> grant create session,select any table to larry;
授权成功。
授权成功,我们通过数据字典DBA_SYS_PRIVS查看用户LARRY具有的系统权限。
例子19-12 查看用户LARRY的系统权限
SQL> connect system/oracle@orcl
已连接。
SQL> select *
2 from dba_sys_privs
3 where grantee ='LARRY';
GRANTEE | PRIVILEGE | ADM |
--------- | --------- | --------- |
LARRY | CREATE SESSION | NO |
LARRY | SELECT ANY TABLE | NO |
从输出可以清楚地看出用户LARRY具有了CREATE SESSION和SELECT ANY TABLE的权利,但是用户LARRY不能将这些权利再赋予其他用户,因为在向用户LARRY授权时,没有使用WITH ADMIN OPTION选项。
下面,我们使用LARRY用户登录数据库并查询SCOTT用户的表信息。
例子19-13 使用用户LARRY登录数据库
SQL> connect larry/abc119#@orcl
已连接。
SQL> select *
2 from scott.dept;
DEPTNO | DNAME | LOC |
--------- | --------- | --------- |
40 | OPERATION | BOSTON |
10 | ACCOUNTING | NEW YORK |
20 | RESEARCH | DALLAS |
30 | SALES | CHICAGO |
因为用户LARRY被赋予了CREATE SESSION的权利,所以可以成功连接数据库,而SELECT ANY TABLE的权限使得它可以查看任何用户的表信息。
因为我们创建的用户都是用于连接数据库,并查看一些表信息,如果业务允许我们可以事先将一些权限赋予当前所有的用户,如CREATE SESSION、SELECT ANY TABLE等,如例子19-14所示。
例子19-14 将部分系统权限赋予所有用户
SQL> conn system/oracle@orcl
已连接。
SQL> grant create session,select any table to public;
授权成功。