转载自oracle表空间配额(quota)
一、quota相关视图
1)dba_ts_quotas(查看所有用户的表空间配额)
BYTES字段表示用户已经使用的空间;MAX_BYTES如果为-1表示没有限制,其他值表示限制配额
--只有用alteruseruser_namequotaontablespace_name;命令显示的调整过用户的空间配额,该视图中才会有记录,否则该视图没有记录
--如果该视图没有信息,我们可以通过user_ts_quotas视图来了解用户的表空间限额信息
2)user_ts_quotas(查看当前用户表空间配额)
--注意可能有时我们查询该视图,用户在某个表空间的配额为0,但是我们依然可以使用该表空间,那么说明用户被赋予了UNLIMITEDTABLESPACE。
--SQL>select*fromuser_sys_privs;查看用户是否具有UNLIMITEDTABLESPACE权限
二、resource角色和quota
注意resource角色被赋予用户时,用户就自动被赋予了UNLIMITEDTABLESPACE权限(虽然resource中并不包含该权限)如果我们把resource角色从用户收回,那么UNLIMITEDTABLESPACE权限也会自动收回
三、配额管理
1)建用户时指定配额
SQL>createuserjavaidentifiedbyoracledefaulttablespaceuserstemporarytablespacetempquota100monusersquota100monsystem;
--注意temp表空间不支持表空间配额
2)更改用户表空间配额
grantunlimitedtablespacetojava;--不对用户作配额限制
alteruserjavaquotaunlimitedonusers;--对指定表空间不做限额
alteruserjavaquota1000monusers;--指定用户在某表空间限制
revokeunlimitedtablespacefromjava;--收回用户的unlimitedtablespace权限
alteruserjavaquota0onusers;--针对alter…quotaunlimited…;
--如果用户已经被授予了unlimitedtablespace权限的话,那么alteruserjavaquota0onusers;限制是不起作用的
四、表空间已删除,关于表空间配额信息还存在
表空间被删除以后但是关于该表空间的配额信息在视图中依然能够查到
这个是正常的,因为表空间被drop后,ts$和tsq$中的信息并没有被清理,如果你重建一个同名的tablespace,并限制quota为0,tsq$中的记录就被删除了.
从10gR2开始,你可以使用
droptablespacemytsincludingcontentsanddatafilesdropquota;
这样的语法,一并将quota信息删除,默认是keepquota.
trace的时候你会发现,如果加上dropquota这样的optionsclause,那么就会有
selectuser#fromtsq$wherets#=:1
deletefromtsq$wherets#=:1anduser#=:2
...
这样的动作.而dba_ts_quotas视图的定义正是使用了tsq$中的信息
createorreplaceviewsys.dba_ts_quotas
(tablespace_name,username,bytes,max_bytes,blocks,max_blocks,dropped)
as
selectts.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')
fromsys.tsq$q,sys.ts$ts,sys.tbs_space_usagespc,sys.user$u
whereq.ts#=ts.ts#
andq.user#=u.user#
andspc.tsn=ts.ts#
andspc.owner=u.name
andq.maxblocks!=0