Oracle
Oracle 允許在撤銷配額後插入表
我正在研究創建使用者和授予角色,我遇到過這種情況,我向使用者授予無限配額,插入表中然後撤銷配額。我預計在將配額設置為 0 後,使用者將無法插入表中。但是,使用者仍然可以插入。我想知道這是否是預期的,是否有另一個命令真正阻止使用者再次插入。我正在使用 Oracle 19c,使用者目前的權限是創建會話和創建表。
sqlplus system\oracle SQL> CREATE TABLESPACE libgeneral datafile '/u01/app/oracle/oradata/ORCLCDB/orcl/libgeneral.dbf' SIZE 20M AUTOEXTEND ON NEXT 40M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; Tablespace created. sqlplus library\libuser SQL> create table t1 ( idx number ) tablespace libgeneral; Table created. SQL> insert into t1 values (1); insert into t1 values (1) * ERROR at line 1: ORA-01536: space quota exceeded for tablespace 'LIBGENERAL' sqlplus system\oracle SQL> alter user library quota unlimited on libgeneral; User altered. sqlplus library\libuser SQL> insert into t1 values (1); 1 row created. sqlplus system\oracle SQL> alter user library quota 0 on libgeneral; User altered. sqlplus library\libuser SQL> insert into t1 values (1); 1 row created.
當您在空表中插入第一行時,Oracle 分配了一個擴展區,該擴展區通常包含 8 個塊,表的第一個擴展區具有預設設置。8 個塊(單個塊的典型大小為 8 KB)可以儲存比 1 行多得多的數據,因此即使您撤銷了配額,該空間也已分配,您可以寫入它,這是預期的行為。
嘗試插入更多行,最終您將收到有關配額的相同錯誤消息。
‘quota’ 指定給定表空間可以使用多少空間。空間是按範圍分配的——邏輯上連續的一系列塊。創建表時,您會立即獲得一個範圍。當您開始插入時,您正在使用之前為擴展區分配的空間。只有當該範圍已滿且需要更多空間時,oracle 才會嘗試分配另一個範圍,然後“配額”才會重新發揮作用。
注意:我認為是在 12c,也許是 11g 中,“延遲”分配的概念開始發揮作用。這樣,就創建了一個具有零範圍的表。那時,表實際上只是數據字典中的一個條目。第一個(初始)擴展區不是在創建表時分配,而是在第一個 INSERT 發出時分配,因此需要為表分配實際空間。
最重要的是,您的使用者仍然能夠插入行,因為這些行正在使用已為該範圍獲取的空間。