1. 程式人生 > >oracle表空間配額(quota)與UNLIMITED TABLESPACE系統許可權

oracle表空間配額(quota)與UNLIMITED TABLESPACE系統許可權

--先大概寫一下,後面有時間會整理一下

一: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

注:UNLIMITED TABLESPACE系統許可權:此係統許可權會覆蓋所有的單個表空間限額,並向用戶提供所有表空間(包括SYSTEM和SYSAUX)的無限制限額(注:授予resource角色的時候也會授予此許可權)

--SQL> select *from user_sys_privs;檢視使用者是否具有UNLIMITED TABLESPACE許可權

二:resource角色和quota

注意resource角色被賦予使用者時,使用者就自動被賦予了UNLIMITED TABLESPACE

許可權(雖然resource中並不包含該許可權)如果我們把resource角色從使用者收回,那麼UNLIMITED TABLESPACE許可權也會自動收回

##注意如果你把resource角色賦予另外一個角色a,然後再把角色a賦予使用者,那麼使用者不會被賦予UNLIMITED TABLESPACE許可權

SQL> select * from role_sys_privs where role='RESOURCE'; >>resource角色中並不包含UNLIMITED TABLESPACE許可權


ROLE                           PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE TABLE                             NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE INDEXTYPE                         NO

SQL> grant connect,resource to test1;

SQL> conn test1/oracle1234;

SQL> select * from session_privs;  >>可以看到被賦予resource角色以後,自動擁有了UNLIMITED TABLESPACE許可權
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

三:配額管理

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