Jeg ønsket å slette noen ubrukte skjemaer på oracle DB.
Hvordan kan jeg søke etter alle skjemanavn?
Bruke sqlplus
sqlplus / as sysdba
run:
SELECT * FROM dba_users
Hvis du bare vil ha brukernavnene, gjør du følgende:
SELECT brukernavn FROM dba_users
Mest sannsynlig vil du
SELECT username
FROM dba_users
Det vil vise deg alle brukerne i systemet (og dermed alle potensielle skjemaer). Hvis din definisjon av "skjema" tillater at et skjema kan være tomt, er det det du ønsker. Det kan imidlertid være et semantisk skille der folk bare vil kalle noe et skjema hvis det faktisk eier minst ett objekt, slik at hundrevis av brukerkontoer som aldri vil eie noen objekter, blir ekskludert. I så fall
SELECT username
FROM dba_users u
WHERE EXISTS (
SELECT 1
FROM dba_objects o
WHERE o.owner = u.username )
Forutsatt at den som opprettet skjemaene var fornuftig med å tildele standard tablespaces og forutsatt at du ikke er interessert i skjemaer som Oracle har levert, kan du filtrere ut disse skjemaene ved å legge til predikater på default_tablespace
, dvs.
SELECT username
FROM dba_users
WHERE default_tablespace not in ('SYSTEM','SYSAUX')
eller
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')
Det er ikke veldig uvanlig å komme over et system der noen feilaktig har gitt en ikke-systembruker et default_tablespace
av SYSTEM
, så vær sikker på at forutsetningene holder før du prøver å filtrere ut Oracle-leverte skjemaer på denne måten.