Ik wilde een aantal ongebruikte schema's van onze Oracle DB verwijderen.
Hoe kan ik een query uitvoeren voor alle schema namen ?
Gebruik sqlplus
sqlplus / as sysdba
uitvoeren:
SELECTEER * FROM dba_users
Als je alleen de gebruikersnamen wilt, doe je het volgende:
SELECT gebruikersnaam VAN dba_users
Waarschijnlijk, wil je
SELECT username
FROM dba_users
Dat zal je alle gebruikers in het systeem tonen (en dus alle mogelijke schema's). Als uw definitie van "schema" toestaat dat een schema leeg is, dan'is dat wat u wilt. Er kan echter een semantisch onderscheid zijn waarbij mensen iets alleen een schema willen noemen als het daadwerkelijk ten minste één object bezit, zodat de honderden gebruikersaccounts die nooit objecten zullen bezitten worden uitgesloten. In dat geval
SELECT username
FROM dba_users u
WHERE EXISTS (
SELECT 1
FROM dba_objects o
WHERE o.owner = u.username )
Ervan uitgaande dat degene die de schema's heeft gemaakt verstandig is geweest met het toekennen van default tablespaces en ervan uitgaande dat je niet geïnteresseerd bent in schema's die Oracle heeft geleverd, kun je die schema's eruit filteren door predicates op de default_tablespace
toe te voegen, d.w.z.
SELECT username
FROM dba_users
WHERE default_tablespace not in ('SYSTEM','SYSAUX')
of
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')
Het is echter niet ongebruikelijk om een systeem tegen te komen waar iemand een niet-systeemgebruiker ten onrechte een default_tablespace
van SYSTEM
heeft gegeven, dus wees er zeker van dat de aannames kloppen voordat je op deze manier de door Oracle aangeleverde schema's probeert uit te filteren.