Consulta Oracle SQL para listar todos os esquemas em um banco de dados


96

Eu queria deletar alguns esquemas não utilizados em nosso banco de dados oracle.

Como posso consultar todos os nomes de esquema?


1
Qual é a sua definição de "não utilizado"?
APC

Estou trabalhando em um projeto de migração de dados e cada desenvolvedor tem seu próprio conjunto de esquemas. (Alguns desenvolvedores saíram e alguns conjuntos de esquemas não são mais usados).
vicsz

Respostas:


130

Usando sqlplus

sqlplus / as sysdba

corre:

SELECIONE * 
FROM dba_users

Se você quiser apenas os nomes de usuário, faça o seguinte:

SELECIONE nome de usuário 
FROM dba_users

1
No entanto, certifique-se de ter permissões para o seu usuário.
diagonalbatman

2
@Andy: é por isso que escrevi "como um usuário privilegiado";)
a_horse_with_no_name

@horse Desculpas eu perdi isso.
diagonalbatman

@a_horse_with_no_name isso significa que um esquema no oracle significa que é um usuário? Quero dizer um schema = user? e sob esse usuário todas as tabelas criadas mesmo como MySQL?
Osama Al-Banna de

66

Provavelmente, você quer

SELECT username
  FROM dba_users

Isso mostrará todos os usuários no sistema (e, portanto, todos os esquemas potenciais). Se sua definição de "esquema" permite que um esquema fique vazio, é isso que você deseja. No entanto, pode haver uma distinção semântica onde as pessoas só querem chamar algo de esquema se ele realmente possuir pelo menos um objeto, de forma que as centenas de contas de usuário que nunca possuirão nenhum objeto sejam excluídas. Nesse caso

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

Supondo que quem criou os esquemas foi sensato ao atribuir espaços de tabela padrão e supondo que você não está interessado nos esquemas que o Oracle entregou, você pode filtrar esses esquemas adicionando predicados no default_tablespace, ou seja,

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

Não é terrivelmente incomum se deparar com um sistema em que alguém tenha dado incorretamente um usuário um não-sistema default_tablespacede SYSTEM, embora, de modo a certeza de que os pressupostos segurar antes de tentar filtrar os esquemas Oracle entregues desta forma.


Combine isso com o predicado where da consulta do FeRtoll e você terá uma consulta razoavelmente segura (provavelmente não cobrirá SYS ou SYSTEM).
Karl

1
Como isso é diferente de select distinct owner from dba_objects?
Dawood ibn Kareem

1
Bem, em uma instância limpa do Oracle, sua consulta, @David, gera um proprietário PÚBLICO adicional
perlyking

28
SELECT username FROM all_users ORDER BY username;

2
Muito útil se o seu usuário não tiver privilégios em dba_users(por exemplo: erro ORA-00942 : table or view does not exist)
Dinei

1
mas a saída é a mesma entre 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'));

Pelo que entendi, esta consulta irá trazer todos os esquemas que contêm tabelas. Isso está certo?
Andrew Spencer

1
Isso só funcionará de forma confiável em versões mais antigas do Oracle. Com a criação de segmento diferido, é possível ter um objeto sem segmento.
Jon Heller

4

E se :

SQL> select * from all_users;

ele retornará uma lista de todos os usuários / esquemas, seus IDs e data de criação no DB:

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

3

Abaixo, o sql lista todos os esquemas no oracle que são criados após a instalação ORACLE_MAINTAINED = 'N' é o filtro. Esta coluna é nova em 12c.

selecione um nome de usuário distinto, ORACLE_MAINTAINED de dba_users onde ORACLE_MAINTAINED = 'N';

1

Qualquer um dos seguintes SQL retornará todo o esquema no banco de dados Oracle.

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

1
Pode haver esquemas que possuem apenas objetos não-tabela, que suas consultas não listariam.
Matthew McPeak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.