Oracle SQL Query per elencare tutti gli schemi in un database


96

Volevo eliminare alcuni schemi inutilizzati sul nostro database Oracle.

Come posso eseguire una query per tutti i nomi di schema?


1
Qual è la tua definizione di "non utilizzato"?
APC

Sto lavorando a un progetto di migrazione dei dati e ogni sviluppatore ha il proprio set di schemi. (Alcuni sviluppatori se ne sono andati e alcuni set di schemi non vengono più utilizzati).
vicsz

Risposte:


130

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

1
Assicurati comunque di avere le autorizzazioni per il tuo utente.
diagonalbatman

2
@ Anddy: ecco perché ho scritto "come utente privilegiato";)
a_horse_with_no_name

@horse scuse mi mancava.
diagonalbatman

@a_horse_with_no_name significa che uno schema in Oracle significa che è un utente? Voglio dire uno schema = utente? e sotto quell'utente tutte le tabelle sono state create come MySQL?
Osama Al-Banna

66

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_tablespacedi SYSTEM, anche se, in modo da essere certi che le ipotesi tengono prima di provare per filtrare gli schemi Oracle-consegnati in questo modo.


Combina questo con il predicato where della query di FeRtoll e avrai una query abbastanza sicura (non probabile che cobber SYS o SYSTEM).
Karl

1
In che modo è diverso da select distinct owner from dba_objects?
Dawood ibn Kareem

1
Bene, su un'istanza Oracle pulita, la tua query, @David, produce un proprietario PUBLIC aggiuntivo
perlyking

28
SELECT username FROM all_users ORDER BY username;

2
Molto utile se il tuo utente non ha privilegi su dba_users(es: errore ORA-00942 : table or view does not exist)
Dinei

1
ma l'output è lo stesso tra dba_users e all_users?
Shailesh Pratapwar

8
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));

A quanto ho capito, questa query mostrerà tutti gli schemi che contengono tabelle. È giusto?
Andrew Spencer

1
Funzionerà in modo affidabile solo nelle versioni precedenti di Oracle. Con la creazione di un segmento differito è possibile avere un oggetto senza un segmento.
Jon Heller

4

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

3

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';

1

Uno dei seguenti SQL restituirà tutto lo schema in Oracle DB.

  1. select owner FROM all_tables group by owner;
  2. select distinct owner FROM all_tables;

1
Potrebbero esserci schemi che contengono solo oggetti non tabella, che le tue query non elencano.
Matthew McPeak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.