Consulta SQL de Oracle para enumerar todos los esquemas en una base de datos


96

Quería eliminar algunos esquemas no utilizados en nuestra base de datos de Oracle.

¿Cómo puedo consultar todos los nombres de esquema?


1
¿Cuál es su definición de "no utilizado"?
APC

Estoy trabajando en un proyecto de migración de datos y cada desarrollador tiene su propio conjunto de esquemas. (Algunos desarrolladores se han ido y algunos conjuntos de esquemas ya no se utilizan).
vicsz

Respuestas:


130

Usando sqlplus

sqlplus / as sysdba

correr:

SELECCIONE * 
DE dba_users

Si solo desea los nombres de usuario, haga lo siguiente:

Elija un nombre de usuario 
DE dba_users

1
Sin embargo, asegúrese de tener permisos sobre su usuario.
diagonalbatman

2
@Andy: por eso escribí "como usuario privilegiado";)
a_horse_with_no_name

@horse Disculpas, me perdí eso.
diagonalbatman

@a_horse_with_no_name ¿eso significa que un esquema en Oracle significa que es un usuario? Me refiero a un esquema = usuario? y bajo ese usuario todas las tablas creadas igual que MySQL?
Osama Al-Banna

66

Lo más probable es que quieras

SELECT username
  FROM dba_users

Eso le mostrará todos los usuarios en el sistema (y por lo tanto todos los esquemas potenciales). Si su definición de "esquema" permite que un esquema esté vacío, eso es lo que desea. Sin embargo, puede haber una distinción semántica en la que las personas solo quieran llamar a algo un esquema si realmente posee al menos un objeto, de modo que se excluyen los cientos de cuentas de usuario que nunca poseerán ningún objeto. En ese caso

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

Suponiendo que quien haya creado los esquemas fue sensato al asignar espacios de tabla predeterminados y asumiendo que no está interesado en los esquemas que Oracle ha entregado, puede filtrar esos esquemas agregando predicados en default_tablespace, es decir

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

No es terriblemente raro encontrarse con un sistema en el que alguien ha dado forma incorrecta un no-sistema del usuario una default_tablespacede SYSTEMembargo, así que asegúrese de que las suposiciones son antes de tratar de filtrar los esquemas suministrados por Oracle de esta manera.


Combine esto con el predicado where de la consulta de FeRtoll y tendrá una consulta bastante segura (no es probable que cobrara SYS o SYSTEM).
Karl

1
¿En qué se diferencia eso de select distinct owner from dba_objects?
Dawood ibn Kareem

1
Bien en una instancia de Oracle limpia, la consulta, @ David, produce un propietario públicos adicionales
perlyking

28
SELECT username FROM all_users ORDER BY username;

2
Muy útil si su usuario no tiene privilegios en dba_users(por ejemplo: error ORA-00942 : table or view does not exist)
Dinei

1
pero ¿la salida es la misma entre dba_users y 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'));

Según tengo entendido, esta consulta mostrará todos los esquemas que contienen tablas. ¿Está bien?
Andrew Spencer

1
Esto solo funcionará de manera confiable en versiones anteriores de Oracle. Con la creación de segmento diferido es posible tener un objeto sin segmento.
Jon Heller

4

Qué tal si :

SQL> select * from all_users;

devolverá la lista de todos los usuarios / esquemas, sus ID y la fecha de creación en la base de datos:

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

3

A continuación, sql enumera todos los esquemas en Oracle que se crean después de la instalación. ORACLE_MAINTAINED = 'N' es el filtro. Esta columna es nueva en 12c.

seleccione un nombre de usuario distinto, ORACLE_MAINTAINED de dba_users donde ORACLE_MAINTAINED = 'N';

1

Cualquiera de los siguientes SQL devolverá todos los esquemas en Oracle DB.

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

1
Es posible que haya esquemas que solo tengan objetos que no sean de tabla, que sus consultas no incluirían en la lista.
Matthew McPeak
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.