Qual è la quota predefinita su un tablespace per un determinato utente in oracle se non si imposta'?
Il mio ambiente
Sto usando Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Spiegazione della situazione
Stavo creando un utente con il seguente comando
create user USRPRACTICA2 identified by 1234 default tablespace users;
Quindi ok, gli ho assegnato un tablespace predefinito, ma NON HO SPECIFICATO alcun limite di quota. Quindi sono andato ai documenti Oracle e ho letto questo:
Per impostazione predefinita, un utente non ha alcuna quota su alcun tablespace nel database. Se l’utente ha il privilegio di creare un oggetto schema, è necessario assegnare una quota per consentire all’utente di creare oggetti. In minima parte, assegnare agli utenti una quota per il tablespace predefinito e quote aggiuntive per altri tablespace in cui possono creare oggetti.
Quindi ho detto bene, ok! Ora voglio testare se questo utente NON può davvero creare tabelle, ad esempio, se non gli ho assegnato una quota.
Quindi, gli ho concesso questi privilegi:
grant create session to USRPRACTICA2;grant create table to USRPRACTICA2;
Bene, ora non dovrei essere in grado di creare tabelle poiché non ho specificato una quota sugli utenti tablespace. Proviamo.
Creo una connessione con USRPRACTICA2 a oracle, provo a creare una tabella, e questo è ciò che accade:
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.
Ops! La tabella è stata creata.
In questo momento penso “bene, ora dovremmo cercare di capire qual è la quota assegnata a quell’utente su quel tablespace, forse c’è una quota predefinita in oracle”. Così ho provato questo:
SQL> select tablespace_name, username, max_bytes 2 from dba_ts_quotas 3 where username = 'USRPRACTICA2' and TABLESPACE_NAME = 'USERS';no rows selected
A questo punto stavo pensando “questa è una sciocchezza, forse non ho scritto la query correttamente”, quindi ho provato questo:
SQL> select * from dba_ts_quotas;TABLESPACE_NAME USERNAME BYTES MAX_BYTES BLOCKS MAX_BLO------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ---------- ---------- ----------SYSAUX AUDSYS 655360 -1 80SYSAUX GSMADMIN_INTERNAL 917504 -1 112SYSAUX DBSFWUSER 0 -1 0SYSAUX APPQOSSYS 0 -1 0SYSAUX GGSYS 0 -1 0SYSAUX OLAPSYS 0 -1 06 rows selected.
Quindi con queste informazioni ho indovinato che, di sicuro, non è stata assegnata alcuna quota per il tablespace degli utenti per l’utente che ho creato.
Inoltre, ho indovinato che in oracle dovrebbe essere memorizzato un valore con la quota predefinita sui tablespace se non ne si imposta uno. Inoltre, anche quell’utente non ha spazio illimitato sul tablespace, perché sarebbe apparso in quella vista con un valore “MAX_BYTES -1”.
Ho navigato molto alla ricerca di un valore di quota predefinito in oracle, e tutto quello che ho potuto ottenere è quello snippet di oracle che dice “Se l’utente ha il privilegio di creare un oggetto schema, è necessario assegnare una quota per consentire all’utente di creare oggetti”. Ma ovviamente come ho mostrato qui, dovrebbe essere un valore di quota predefinito da qualche parte.
Per finire, ho appena provato un’altra cosa. Se assegni un valore di quota per l’utente come questo
alter user USRPRACTICA2 quota 1M on USERS;
Ora se interroghi le quote del tablespace, troverai le informazioni
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
Quindi la mia domanda qui è…
Esiste un valore di quota predefinito assegnato a un utente in un tablespace se non lo si specifica? Se è così, come posso mostrare quel valore?