在我们使用oracle时,关系最密切的一个操作就是对新建的用户授予相应的权限;
通常执行授权时的操作为:
Grant xxx to user
收回权限时为
Revoke xxx from user;
从普通使用角度这对于oracle的使用基本满足了,但是如果你想深入了解oracle就必须知道以上的过程到底在后台进行了哪些操作,对其本质有所了解;那么下面我们就对其进行一个详细的说明:
首先我们对session启用跟踪,并且获取相关的trace文件:
grant sysdba to scott
END OF STMT
PARSE #2:c=0,e=1182,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=7996151421
=====================
PARSING IN CURSOR #1 len=117 dep=1 uid=0 ct=2 lid=0 tim=7996153689 hv=877567579 ad='9398b9d8'
insert into sysauth$ (grantee#,privilege#,option$,sequence#) values (:1,:2,decode(:3,0,null,:3),system_grant.nextval)
END OF STMT
PARSE #1:c=0,e=52,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=7996153685
XCTEND rlbk=0, rd_only=1
EXEC #2:c=0,e=54807,p=0,cr=0,cu=2,mis=0,r=0,dep=0,og=1,tim=7996208368
*** 2011-09-01 10:12:54.684
XCTEND rlbk=0, rd_only=1
=====================
PARSING IN CURSOR #1 len=24 dep=0 uid=0 ct=18 lid=0 tim=8007678124 hv=526852247 ad='9e7377fc'
revoke sysdba from scott
END OF STMT
PARSE #1:c=0,e=1273,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=8007678120
=====================
PARSING IN CURSOR #2 len=56 dep=1 uid=0 ct=7 lid=0 tim=8007680454 hv=890661608 ad='9398addc'
delete from sysauth$ where grantee#=:1 and privilege#=:2
END OF STMT
PARSE #2:c=0,e=69,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=8007680450
XCTEND rlbk=0, rd_only=1
EXEC #1:c=15600,e=36672,p=0,cr=0,cu=2,mis=0,r=0,dep=0,og=1,tim=8007716994
那么我们可以看当对某个用户进行授权时,oracle会在其基表:sysauth$上插入相关的数据,那么sysauth$基表的是什么含义呢:
sys@192.168.0.123:ORCL>desc sysauth$
名称 是否为空?类型
----------------------------------------- -------- -------
GRANTEE# NOT NULL NUMBER
PRIVILEGE# NOT NULL NUMBER
SEQUENCE# NOT NULL NUMBER
OPTION$ NUMBER
说明如下:
grantee# number not null,
privilege# number not null,
sequence# number not null,
option$ number
在没有对scott用户授权时,查看sysauth$内容
sys@192.168.0.123:ORCL>select * from sysauth$ m where m.grantee#=54;
GRANTEE# PRIVILEGE# SEQUENCE# OPTION$
---------- ---------- ---------- ----------
54 2 836
54 3 837
54 68 1053
当对其授权后:
sys@192.168.0.123:ORCL>select * from sysauth$ m where m.grantee#=54;
GRANTEE# PRIVILEGE# SEQUENCE# OPTION$
---------- ---------- ---------- ----------
54 2 836
54 3 837
54 68 1053
54 4 1097
54 -15 1098
那么4和-15代表的是什么权限呢,在此说明一下:
4-- 'GRANT'
-15-- 'UNLIMITED TABLESPACE'
查看用户权限:
sys@192.168.0.123:ORCL>col grantee format a15
sys@192.168.0.123:ORCL>col privilege format a20
sys@192.168.0.123:ORCL>select * from dba_sys_privs n where n.grantee='SCOTT';
GRANTEE PRIVILEGE ADMIN_
--------------- -------------------- ------
SCOTT UNLIMITED TABLESPACE NO
sys@192.168.0.123:ORCL>select * from dba_role_privs i where i.grantee='SCOTT';
GRANTEE GRANTED_RO ADMIN_ DEFAUL
--------------- ---------- ------ ------
SCOTT RESOURCE NO YES
SCOTT DBA NO YES
SCOTT PLUSTRACE NO YES
SCOTT CONNECT NO YES
注意:此时你可能发现为什么没有具体的grant权限呢,这是因为dba是一个角色,grant权限已经包含在其内,在sysauth$是授权dba时,只增加两条记录是因为其他的权限已经存在了;
我们回收scott的dba权限:
sys@192.168.0.123:ORCL>revoke dba from scott;
撤销成功。
发现相关的权限已经丢失:
sys@192.168.0.123:ORCL>select * from dba_sys_privs n where n.grantee='SCOTT';
未选定行
接下来我们对scott直接授权而不使用grant语句:
sys@192.168.0.123:ORCL>insert into sysauth$ (grantee#,privilege#,option$,sequence#)
2 values (54,4,null,system_grant.nextval);
已创建1行。
sys@192.168.0.123:ORCL>insert into sysauth$ (grantee#,privilege#,option$,sequence#)
2 values (54,-15,null,system_grant.nextval);
已创建1行。
sys@192.168.0.123:ORCL>select * from dba_sys_privs n where n.grantee='SCOTT';
GRANTEE PRIVILEGE ADMIN_
--------------- -------------------- ------
SCOTT UNLIMITED TABLESPACE NO
权限回来了;
当你看到这些会想到什么呢;