--先大概写一下,后面有时间会整理一下

一:quota相关视图

1)dba_ts_quotas(查看所有用户的表空间配额)

BYTES字段表示用户已经使用的空间;MAX_BYTES如果为-1表示没有限制,其他值表示限制配额

--只有用alter user user_name quota on tablespace_name;命令显示的调整过用户的空间配额,该视图中才会有记录,否则该视图没有记录

--如果该视图没有信息,我们可以通过user_ts_quotas视图来了解用户的表空间限额信息

2) user_ts_quotas(查看当前用户表空间配额)

--注意可能有时我们查询该视图,用户在某个表空间的配额为0,但是我们依然可以使用该表空间,那么说明用户被赋予了UNLIMITED TABLESPACE

--SQL> select *from user_sys_privs;查看用户是否具有UNLIMITED TABLESPACE权限

二:resource角色和quota

注意resource角色被赋予用户时,用户就自动被赋予了UNLIMITED TABLESPACE权限(虽然resource中并不包含该权限)如果我们把resource角色从用户收回,那么UNLIMITED TABLESPACE权限也会自动收回

三:配额管理

1)建用户时指定配额

SQL> create user java identified by oracle default tablespace users temporary tablespace temp quota 100m on users quota 100m on system;

--注意temp表空间不支持表空间配额

2)更改用户表空间配额

grant unlimited tablespace to java;--不对用户作配额限制

alter user java quota unlimited on users;--对指定表空间不做限额

alter user java quota 1000m on users;--指定用户在某表空间限制

revoke unlimited tablespace from java;--收回用户的unlimited tablespace权限

alter user java quota 0 on users;--针对alter … quota unlimited …;

--如果用户已经被授予了unlimited tablespace权限的话,那么alter user java quota 0 on users;限制是不起作用的

四:表空间已删除,关于表空间配额信息还存在

表空间被删除以后但是关于该表空间的配额信息在视图中依然能够查到

这个是正常的,因为表空间被drop,ts$tsq$中的信息并没有被清理,如果你重建一个同名的tablespace,并限制quota 0,tsq$中的记录就被删除了.

10gR2开始,你可以使用
drop tablespace mytsincluding contents and datafiles drop quota;
这样的语法,一并将quota信息删除,默认是keep quota.

trace的时候你会发现,如果加上drop quota这样的options clause,那么就会有
select user# from tsq$ wherets#=:1
delete from tsq$ where ts#=:1and user#=:2
...
这样的动作.dba_ts_quotas视图的定义正是使用了tsq$中的信息
create or replace viewsys.dba_ts_quotas
(tablespace_name, username, bytes, max_bytes, blocks, max_blocks, dropped)
as
select ts.name, u.name, nvl(spc.bytes, 0),
       decode(q.maxblocks, -1, -1, q.maxblocks *ts.blocksize),
       nvl(spc.blocks, 0), q.maxblocks, decode(ts.online$,3, 'YES', 'NO')
from sys.tsq$ q, sys.ts$ ts, sys.tbs_space_usagespc, sys.user$ u
where q.ts# = ts.ts#
  and q.user# = u.user#
  and spc.tsn  = ts.ts#
  and spc.owner = u.name
  and q.maxblocks != 0