关于对USER_TS_QUOTAS视图和表空间权限的研究

    起因是前两天遇到一个使用人员的反馈,他提到了在数据库里面建表报空间无法扩展的错误,经过查看是表空间还剩余300多M的剩余表空间,同时系统比较繁忙可能存在查询、排序、子查询等操作,因为造成无法完成创建表的操作,另外使用人员又反应在user_ts_quotas系统视图当中发现了自己使用的帐户的默认表空间也在里面,问是不是对表空间使用有限制?
    因为我查看了该帐户具有resource的角色,因为之前对这个视图还不甚了解,于是想是不是赋予了resource的角色后又被管理员收回了unlimited tablespace的权限,没怎么想就重新给赋予了一次resource角色。但是想了想又不对,因为这有可能会改变之前的权限设定,于是跟局方说明了情况,局方让我立刻恢复用户原来的权限,这个时候我也有点思路不清晰,之前该帐户具有那些表空间的使用权限呢,这该怎么查?想想还是先从user_ts_quotas着手,于是先从oracle的文档里面进行查找, 找到了字段解释
SQL> desc user_ts_quotas
Name
-----------------------
TABLESPACE_NAME  => 表空间名称
BYTES            => 用户在该表空间使用的大小
MAX_BYTES        => 对用户在该表空间使用的大小限制
BLOCKS           => 用户在该表空间使用的数据块数量
MAX_BLOCKS       => 对用户在该表空间使用的数据块数量限制
DROPPED          => 表空间是否被删除
    同样的,另外一个视图DBA_TS_QUOTAS多了一个username字段,但是这里需要说明的是这两个视图查询出来的结果并不一致,因为我只有dba权限,而没有该试用人员反应的帐户的访问权限,因此给我造成了困惑,因为我通过dba_ts_quotas并没有看到该用户的信息,在本机上做如下测试:
SQL> select tablespace_name,bytes,max_bytes,blocks,max_blocks,dropped from dba_ts_quotas where username='SCOTT';

no rows selected

SQL> conn scott/tiger

SQL> select tablespace_name,bytes,max_bytes,blocks,max_blocks,dropped from user_ts_quotas;

no rows selected

    同样也没有看到,这表明是SCOTT这个用户并没有进行表空间配额的限制,由于使用人员发来的视图max_bytes是0的值,经过一番测试发现了其中的原委:
1.具有unlimited tablespace权限的情况下,任何在unlimited tablespace赋予之前或者之后发出的alter user xxx quota n on tablespace_name都会被忽略,用户具有任意表空间的使用权限;
2.当撤销了unlimited tablespace权限后,只有使用alter user xxx quota [n/unlimited] on tablespace_name的方式来给某个用户授予某些表空间的使用权限,除此之外还可以使用命令 alter user xxx default tablespace xxxx来为某个用户指定一个默认表空间,如无上述其他权限,则该用户只具备默认表空间的使用权限,同时这个默认表空间也不会出现在user_ts_quotas视图中;
3.只要发出了alter user xxx quota n on tablespace_name命令都会记录发user_ts_quotas视图当中,不管n是0还是其它数值,但是只有当n=0时在dba_ts_quotas当中看不到记录,非零值才会记录到该视图当中(0值表示在该表空间上无空间配额)。
4.关于DROPED字段的含义是这样的:当表空间被删除,user_ts_quotas也会显示出来,例如
TABLESPACE_NAME                     BYTES  MAX_BYTES     BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
TEST                                    0          0          0          0 YES
SYSTEM                                  0          0          0          0 NO
USERS                            20119552          0       2456          0 NO
EXAMPLE                                 0          0          0          0 NO
    当删除了TEST表空间后,dropped的值是yes,在没有unlimited tablespace权限的情况下,当重新创建了TEST表空间后可以发现这个限制就会发挥作用,即无法在TEST表空间下创建,即使将用户的默认表空间设为test表空间,配额限制依然生效。  通过以上测试,已经清楚了,生产库的此用户应该具备了unlimited tablespace 权限,因此我所做的grant resource to xxx 并没有对该用户产生影响,至此给局方进行了解释之后,问题得到解决。
 
来源:http://space.itpub.net/12216142/viewspace-704795

你可能感兴趣的:(oracle,sql,数据库,测试,user,文档)