原文轉自:http://www.askmaclean.com/archives/know-more-about-oracle-user-space-quota.html
Tablespace Quota 表空間限額是Oracle資料庫中限制User使用空間的重要手段,我們來深入淺出地了解一下Space Quota在内部的實作:
以上可以看到登入使用者quota限額資訊到資料字典的dictionary recursive SQL 資料字典遞歸SQL是”insert into tsq$” 向字典TSQ$中插入一條記錄, TSQ$是重要的資料字典基表,在建立資料字典時被create, 在11g以前可以從$ORACLE_HOME/rdbms/admin/sql.bsq中找到該表的定義:
USER_TS_QUOTAS和DBA_TS_QUOTAS這些字典視圖直接依賴于tsq$和seg$這2個字典基表, 它們的定義在11g之前可以在$ORACLE_HOME/rdbms/admin/catspace.sql中找到:
需要注意的是UNLIMITED TABLESPACE這個無限表空間限額的系統權限并不依賴于TSQ$的份額基表,是以也不會産生USER_TS_QUOTAS/DBA_TS_QUOTAS中的記錄:
此外Oracle并不會通過dictionary recursive SQL字典遞歸SQL了解表空間份額的資訊,而是直接将這部分資訊緩存在row cache字典緩存的dc_tablespace_quotas中:
當我們添加一個定額使用者(quota user)時, 相應的要多産生一個dc_tablespace_quotas row cache parent object:
可以看到以上address=0x872d3d08對象的dc_tablespace_quotas記錄是create user/alter user quota後産生的,該row cache的data stack中的0×3200對應為12800 個block。
修改該使用者的quota資訊,會引發stack data的變化:
Oracle内部使用KTS子產品的函數實作Tablespace Quota的管理, 以下為ORA-01950錯誤的errostack stack call: