Como listar todas as tabelas em um esquema no Oracle SQL?

158

Como listar todas as tabelas em um esquema no Oracle SQL?

benstpierre
fonte

Respostas:

219

Para ver todas as tabelas em outro esquema, você precisa ter um ou mais dos seguintes privilégios do sistema:

SELECT ANY DICTIONARY
(SELECT | INSERT | UPDATE | DELETE) ANY TABLE

ou o grande martelo, o papel do DBA.

Com qualquer um desses, você pode selecionar:

SELECT DISTINCT OWNER, OBJECT_NAME 
  FROM DBA_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
   AND OWNER = '[some other schema]'

Sem esses privilégios do sistema, você pode ver apenas as tabelas às quais você concedeu algum nível de acesso, seja diretamente ou através de uma função.

SELECT DISTINCT OWNER, OBJECT_NAME 
  FROM ALL_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
   AND OWNER = '[some other schema]'

Por fim, você sempre pode consultar o dicionário de dados em busca de suas próprias tabelas, pois seus direitos a elas não podem ser revogados (a partir de 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
Adam Musch
fonte
2
a "resposta mais completa", além do uso de em %_OBJECTSvez de %_TABLES.
APC
Lembro-me no 9i que as visualizações seriam listadas em% _TABLES - portanto, por exemplo, tentar automatizar o esvaziamento de um esquema acabaria com instruções como DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS lançando erros. Portanto, você precisará remover as visualizações com MENOS / NÃO IN / NÃO EXISTE ou voltar%% _OBJECTS. Além disso, ir contra% _OBJECTS deixa uma dica tentadora do que mais pode estar lá!
Adam Musch
1
Não há absolutamente nenhuma necessidade para DISTINCTa consulta. owner, object_nameé único emALL_OBJECTS
a_horse_with_no_name 20/08
1
Essas consultas não precisam de distintas, isso é verdade; no entanto, owner, object_namenão é exclusivo por nenhum meio em dba_objects; Os corpos e os pacotes do pacote aparecem nessa exibição e as tabelas e os índices estão em diferentes namespaces.
Adam Musch
A última consulta não funcionará como está no XE 11.2. Parece que não existe uma coluna 'owner' em 'user_objects'.
Rafael Chaves
71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';
Tom
fonte
2
Isso só mostrará todas as tabelas em YOURSCHEMA se executada por YOURSCHEMA ou executada por um usuário com os privilégios mencionados por Adam Musch. Caso contrário, apenas mostra as tabelas em YOURSCHEMA às quais recebemos privilégios.
APC
14

Você pode consultar USER_TABLES

select TABLE_NAME from user_tables
Sathyajith Bhat
fonte
5
Essas são todas as tabelas do SEU esquema, nem todas as tabelas do esquema A. Além disso, as visualizações do dicionário de dados * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) incluem visualizações.
Adam Musch
substituir "incluir visualizações" por "pode ​​incluir visualizações em versões seme do Oracle".
Adam Musch
@ Adam Musch Testado usando o Oracle 10g R2, ele não retornou visualizações.
Sathyajith Bhat
4

Se você efetuou login como Usuário Normal sem a permissão do DBA, pode usar o seguinte comando para ver todas as tabelas e visualizações do seu próprio esquema.

select * from tab;
chan
fonte
3

Tente isso, substitua? com o seu nome do esquema

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'
SQLMenace
fonte
3
Isso é mais independente de banco de dados e, portanto, acho que esse tipo de solução é melhor do que todas as alternativas. Penso que o INFORMATION_SCHEMA funciona em praticamente todos os principais bancos de dados que já vi. Embora alguns diferem em quais informações você pode obter, pelo menos é um local consistente para procurar. No entanto, ao fazer uma pesquisa rápida na Internet, parece que o Oracle é praticamente o único banco de dados que não suporta Information_Schema, mesmo que faça parte do padrão SQL-92.
21710 Kibbee
2

Se você estiver acessando o Oracle com JDBC (Java), poderá usar a classe DatabaseMetadata . Se você estiver acessando o Oracle com o ADO.NET, poderá usar uma abordagem semelhante.

Se você estiver acessando o Oracle com ODBC, poderá usar a função SQLTables .

Caso contrário, se você precisar apenas das informações no SQLPlus ou em um cliente Oracle similar, uma das consultas já mencionadas será suficiente. Por exemplo:

select TABLE_NAME from user_tables
Pablo Santa Cruz
fonte
2
select * from cat;

mostrará todas as tabelas no seu gato de esquema, sinônimo de user_catalog

Arsalan Sheikh
fonte
2
select TABLE_NAME from user_tables;

A consulta acima fornecerá os nomes de todas as tabelas presentes nesse usuário;

AA Nayak
fonte
2
select * from user_tables;

(mostrando todas as tabelas)

yash
fonte
1

SELECT table_name, owner FROM all_tables em que owner = 'schema_name' ordena por table_name

Sreeju
fonte
1

Você pode executar diretamente a segunda consulta se souber o nome do proprietário.

- Primeiro, você pode selecionar o que todos os PROPRIETÁRIOS existem:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

--Então você pode ver as tabelas abaixo desse proprietário:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');
Kermit, o sapo
fonte
0

Se você precisar obter o tamanho da tabela também, isso será útil:

select SEGMENT_NAME, PARTITION_NAME, BYTES from user_segments where SEGMENT_TYPE='TABLE' order by 1

Vijay Kumar
fonte
0

Nome do contador de tabela e linhas para todas as tabelas no OWNEResquema:

SELECT table_name, num_rows counter from DBA_TABLES WHERE owner = 'OWNER'

SergioLeone
fonte