Requête Oracle SQL pour répertorier tous les schémas dans une base de données


96

Je voulais supprimer certains schémas inutilisés sur notre base de données oracle.

Comment puis-je rechercher tous les noms de schéma?


1
Quelle est votre définition de «inutilisé»?
APC

Je travaille sur un projet de migration de données, et chaque développeur a son propre ensemble de schémas. (Certains développeurs sont partis et certains ensembles de schémas ne sont plus utilisés).
vicsz le

Réponses:


130

Utilisation de sqlplus

sqlplus / comme sysdba

courir:

CHOISIR * 
DE dba_users

Si vous souhaitez uniquement les noms d'utilisateur, procédez comme suit:

SELECT nom d'utilisateur 
DE dba_users

1
Assurez-vous cependant que vous disposez des autorisations sur votre utilisateur.
diagonalbatman

2
@Andy: c'est pourquoi j'ai écrit "en tant qu'utilisateur privilégié";)
a_horse_with_no_name

@horse Excuses J'ai raté ça.
diagonalbatman le

@a_horse_with_no_name est-ce que cela signifie qu'un schéma dans oracle signifie que c'est un utilisateur? Je veux dire un schéma = utilisateur? et sous cet utilisateur toutes les tables créées de la même manière que MySQL?
Osama Al-Banna

66

Très probablement, vous voulez

SELECT username
  FROM dba_users

Cela vous montrera tous les utilisateurs du système (et donc tous les schémas potentiels). Si votre définition de «schéma» permet à un schéma d'être vide, c'est ce que vous voulez. Cependant, il peut y avoir une distinction sémantique où les gens ne veulent appeler quelque chose un schéma que s'il possède réellement au moins un objet afin que les centaines de comptes d'utilisateurs qui ne posséderont jamais aucun objet soient exclus. Dans ce cas

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )

En supposant que la personne qui a créé les schémas a eu raison d'attribuer des tablespaces par défaut et de supposer que vous n'êtes pas intéressé par les schémas fournis par Oracle, vous pouvez filtrer ces schémas en ajoutant des prédicats sur le default_tablespace, c.-à-d.

SELECT username
  FROM dba_users
 WHERE default_tablespace not in ('SYSTEM','SYSAUX')

ou

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

Il n'est pas terriblement rare de rencontrer un système dans lequel quelqu'un a incorrectement donné à un utilisateur non-système un default_tablespacede SYSTEM, alors assurez-vous que les hypothèses sont valables avant d'essayer de filtrer les schémas fournis par Oracle de cette manière.


Combinez cela avec le prédicat where de la requête de FeRtoll et vous obtiendrez une requête assez sûre (peu susceptible de cobber SYS ou SYSTEM).
Karl

1
En quoi est-ce différent select distinct owner from dba_objects?
Dawood ibn Kareem

1
Eh bien sur une instance Oracle propre, votre requête, @David, donne un propriétaire PUBLIC supplémentaire
perlyking

28
SELECT username FROM all_users ORDER BY username;

2
Très utile si votre utilisateur n'a pas de privilèges sur dba_users(par exemple: erreur ORA-00942 : table or view does not exist)
Dinei

1
mais la sortie est-elle la même entre dba_users et 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'));

Si je comprends bien, cette requête affichera tous les schémas contenant des tables. Est-ce correct?
Andrew Spencer

1
Cela ne fonctionnera de manière fiable que dans les anciennes versions d'Oracle. Avec la création de segment différée, il est possible d'avoir un objet sans segment.
Jon Heller

4

Que diriez-vous :

SQL> select * from all_users;

il renverra la liste de tous les utilisateurs / schémas, leur ID et la date de création dans DB:

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1                         120 09-SEP-15
SCHEMA2                         119 09-SEP-15
SCHEMA3                         118 09-SEP-15

4

Ci-dessous sql répertorie tous les schémas dans oracle qui sont créés après l'installation ORACLE_MAINTAINED = 'N' est le filtre. Cette colonne est nouvelle en 12c.

sélectionnez un nom d'utilisateur distinct, ORACLE_MAINTAINED à partir de dba_users où ORACLE_MAINTAINED = 'N';

2

L'un ou l'autre des SQL suivants renverra tout le schéma dans Oracle DB.

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

1
Il peut y avoir des schémas contenant uniquement des objets non-table, que vos requêtes ne répertorieraient pas.
Matthew McPeak
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.