Volevo eliminare alcuni schemi inutilizzati sul nostro database Oracle.
Come posso eseguire una query per tutti i nomi di schema?
Volevo eliminare alcuni schemi inutilizzati sul nostro database Oracle.
Come posso eseguire una query per tutti i nomi di schema?
Risposte:
Utilizzando sqlplus
sqlplus / come sysdba
correre:
SELEZIONARE * FROM dba_users
Se desideri solo i nomi utente, procedi come segue:
SELEZIONA nome utente FROM dba_users
Molto probabilmente, vuoi
SELECT username
FROM dba_users
Questo ti mostrerà tutti gli utenti del sistema (e quindi tutti i potenziali schemi). Se la tua definizione di "schema" consente che uno schema sia vuoto, è quello che vuoi. Tuttavia, può esserci una distinzione semantica in cui le persone vogliono chiamare qualcosa uno schema solo se in realtà possiede almeno un oggetto, in modo da escludere le centinaia di account utente che non possiederanno mai alcun oggetto. In quel caso
SELECT username
FROM dba_users u
WHERE EXISTS (
SELECT 1
FROM dba_objects o
WHERE o.owner = u.username )
Supponendo che chiunque abbia creato gli schemi fosse ragionevole nell'assegnare spazi tabelle predefiniti e presumendo che non si sia interessati agli schemi forniti da Oracle, è possibile filtrare quegli schemi aggiungendo predicati su default_tablespace
, ie
SELECT username
FROM dba_users
WHERE default_tablespace not in ('SYSTEM','SYSAUX')
o
SELECT username
FROM dba_users u
WHERE EXISTS (
SELECT 1
FROM dba_objects o
WHERE o.owner = u.username )
AND default_tablespace not in ('SYSTEM','SYSAUX')
Non è così raro imbattersi in un sistema in cui qualcuno ha dato in modo non corretto un non-sistema all'utente una default_tablespace
di SYSTEM
, anche se, in modo da essere certi che le ipotesi tengono prima di provare per filtrare gli schemi Oracle-consegnati in questo modo.
select distinct owner from dba_objects
?
SELECT username FROM all_users ORDER BY username;
dba_users
(es: errore ORA-00942 : table or view does not exist
)
select distinct owner
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
Che ne dite di :
SQL> select * from all_users;
restituirà l'elenco di tutti gli utenti / schemi, i loro ID e la data di creazione nel DB:
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1 120 09-SEP-15
SCHEMA2 119 09-SEP-15
SCHEMA3 118 09-SEP-15
Di seguito sql elenca tutti gli schemi in Oracle che vengono creati dopo l'installazione ORACLE_MAINTAINED = 'N' è il filtro. Questa colonna è nuova in 12c.
seleziona un nome utente distinto, ORACLE_MAINTAINED da dba_users dove ORACLE_MAINTAINED = 'N';
Uno dei seguenti SQL restituirà tutto lo schema in Oracle DB.
select owner FROM all_tables group by owner;
select distinct owner FROM all_tables;