Oracle

如果您不設置,oracle 中給定使用者的表空間的預設配額是多少?

  • December 5, 2019

我的環境

我正在使用Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

情況說明

我正在使用以下命令創建使用者

create user USRPRACTICA2 identified by 1234 default tablespace users;

好吧,我為它分配了一個預設表空間,但我沒有指定任何配額限制。然後我去了 Oracle 文件,我讀到了這個:

預設情況下,使用者在數據庫中的任何表空間上都沒有配額。如果使用者有權創建模式對象,則必須分配配額以允許使用者創建對象。最低限度地,為使用者分配預設表空間的配額,並為他們可以在其中創建對象的其他表空間分配額外的配額。

那我說好,好!現在我想測試這個使用者是否真的不能創建表,例如,如果我沒有給它分配配額。

然後,我授予它以下權限:

grant create session to USRPRACTICA2;
grant create table to USRPRACTICA2; 

好吧,現在我應該無法創建表,因為我沒有為表空間使用者指定配額。讓我們試試看。

我用 USRPRACTICA2 創建了一個到 oracle 的連接,我嘗試創建一個表,結果如下:

SQL> CREATE TABLE EMP
 2  (EMPNO NUMBER(4) NOT NULL,
 3  ENAME VARCHAR2(10),
 4  JOB VARCHAR2(9),
 5  MGR NUMBER(4),
 6  HIREDATE DATE,
 7  SAL NUMBER(7, 2),
 8  COMM NUMBER(7, 2),
 9  DEPTNO NUMBER(2));

Tabla creada.

哎呀!表已創建。

此刻是我想“好吧,我們現在應該嘗試弄清楚在該表空間上分配給該使用者的配額是多少,也許oracle中有一個預設配額”。所以我嘗試了這個:

SQL> select tablespace_name, username, max_bytes
 2     from dba_ts_quotas
 3     where username = 'USRPRACTICA2' and TABLESPACE_NAME = 'USERS';

no rows selected

此時我在想“這是胡說八道,也許我沒有正確編寫查詢”,所以我嘗試了這個:

SQL> select * from dba_ts_quotas;

TABLESPACE_NAME                USERNAME                                                                                                                      BYTES  MAX_BYTES     BLOCKS MAX_BLO
------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ---------- ---------- ----------
SYSAUX                         AUDSYS                                                                                                                       655360         -1         80
SYSAUX                         GSMADMIN_INTERNAL                                                                                                            917504         -1        112
SYSAUX                         DBSFWUSER                                                                                                                         0         -1          0
SYSAUX                         APPQOSSYS                                                                                                                         0         -1          0
SYSAUX                         GGSYS                                                                                                                             0         -1          0
SYSAUX                         OLAPSYS                                                                                                                           0         -1          0

6 rows selected.

因此,有了這些資訊,我猜想,可以肯定的是,沒有為我創建的使用者的使用者表空間分配配額。

另外,我猜想在 oracle 中,如果您不設置預設配額,它應該在表空間上儲存一些值。此外,該使用者在表空間上也沒有無限空間,因為它會以“MAX_BYTES -1”值出現在該視圖中。

我瀏覽了很多在 oracle 中尋找預設配額值,我能得到的只是 oracle 的片段說“如果使用者有權創建模式對象,您必須分配配額以允許使用者創建對象” . 但顯然就像我在這裡展示的那樣,它應該是某個地方的預設配額值。

最後,我只是嘗試了另一件事。如果您確實像這樣為使用者分配配額值

alter user USRPRACTICA2 quota 1M on USERS; 

現在如果你查詢表空間配額,你會發現資訊

SQL> select tablespace_name, username, max_bytes
 2     from dba_ts_quotas
 3     where username = 'USRPRACTICA2' and TABLESPACE_NAME = 'USERS';

TABLE USERNAME      MAX_BYTES
----- ------------ ----------
USERS USRPRACTICA2    1048576

所以我的問題是……

如果不指定,是否為表空間中的使用者分配了預設配額值?如果是這樣,我如何顯示該值?

預設值為 0。

由於延遲段創建,您能夠創建表。

創建表

deferred_segment_creation

使用此子句確定數據庫何時應為此表創建段:

SEGMENT CREATION DEFERRED:該子句推遲表段的創建——以及表的任何 LOB 列的段、作為表創建的一部分隱式創建的任何索引以及隨後在表上顯式創建的任何索引——直到表的第一行數據被插入到表中。那時,表的段、LOB 列和索引以及顯式創建的索引都將被具體化並繼承此 CREATE TABLE 語句中指定的任何儲存屬性,或者在顯式創建索引的情況下,繼承 CREATE INDEX 語句中指定的任何儲存屬性。無論初始插入操作是未送出還是回滾,都會創建這些段。 這是預設值。

警告:當使用延遲段創建創建許多表時,請確保為數據庫分配足夠的空間,以便在插入第一行時,有足夠的空間用於所有新段。SEGMENT CREATION IMMEDIATE:表段是作為此 CREATE TABLE 語句的一部分創建的。

立即創建段很有用,例如,如果您的應用程序依賴於出現在 DBA_、USER_ 和 ALL_SEGMENTS 數據字典視圖中的對象,因為在創建段之前對像不會出現在這些視圖中。此子句覆蓋 DEFERRED_SEGMENT_CREATION 初始化參數的設置。

使用延遲段創建,您只是在字典中為表創建了元數據,但在表空間中,沒有創建任何內容。

SQL> create user u1 identified by u1 default tablespace users;

User created.

SQL> grant create table to u1;

Grant succeeded.

SQL> create table u1.t1 (c1 number);

Table created.

SQL> create table u1.t2 (c1 number) segment creation immediate;
create table u1.t2 (c1 number) segment creation immediate
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'

即使您有一個表,如果沒有配額,嘗試向其中插入數據也會失敗:

SQL> insert into u1.t1 values(1);
insert into u1.t1 values(1)
              *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'

引用自:https://dba.stackexchange.com/questions/254949