Come posso elencare tutte le tabelle in uno schema in Oracle SQL?


159

Come elenco tutte le tabelle in uno schema in Oracle SQL?

Risposte:


220

Per visualizzare tutte le tabelle in un altro schema, è necessario disporre di uno o più dei seguenti privilegi di sistema:

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

o il martello, il ruolo DBA.

Con uno di questi, è possibile selezionare:

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

Senza tali privilegi di sistema, puoi vedere solo le tabelle a cui ti è stato concesso un certo livello di accesso, sia direttamente che attraverso un ruolo.

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

Infine, puoi sempre eseguire una query sul dizionario dei dati per le tue tabelle, poiché i tuoi diritti sulle tue tabelle non possono essere revocati (a partire da 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

2
la "risposta più completa" a parte il suo uso al %_OBJECTSposto di %_TABLES.
APC,

Ricordo in 9i che le viste sarebbero elencate in% _TABLES - quindi, ad esempio, il tentativo di automatizzare lo svuotamento di uno schema finirebbe con istruzioni come DROP TABLE REALLY_A_VIEW VINCOLI DI CASCATA che generano errori. Quindi dovresti rimuovere le visualizzazioni con MINUS / NOT IN / NOT EXISTS o ripetere% _OBJECTS. Inoltre, andare contro% _OBJECTS lascia un allettante suggerimento su cos'altro potrebbe esserci!
Adam Musch,

1
Non è assolutamente necessario per DISTINCTla query. owner, object_nameè unico inALL_OBJECTS
a_horse_with_no_name

1
Quelle domande non hanno bisogno di distinti, è vero; tuttavia, owner, object_namenon è univoco in alcun modo in dba_objects; Corpi e pacchetti di pacchetto appaiono entrambi in quella vista e le tabelle e gli indici sono in spazi dei nomi diversi.
Adam Musch,

L'ultima query non funzionerà come in XE 11.2. Sembra che non ci sia una colonna "proprietario" in "oggetti_utente".
Rafael Chaves,

71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';

2
Questo mostrerà tutte le tabelle in YOURSCHEMA se eseguito da YOURSCHEMA o gestito da un utente con i privilegi menzionati da Adam Musch. Altrimenti mostra solo le tabelle in YOURSCHEMA a cui ci sono stati concessi i privilegi.
APC,

14

Puoi interrogare USER_TABLES

select TABLE_NAME from user_tables

5
Sono tutte le tabelle nel TUO schema, non tutte le tabelle in Uno schema. Inoltre, le viste del dizionario di dati * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) includono le viste.
Adam Musch,

sostituire "include viste" con "può includere viste nelle versioni seme di Oracle".
Adam Musch,

@Adam Musch Testato utilizzando Oracle 10g R2, non ha restituito visualizzazioni.
Sathyajith Bhat,

4

Se si è effettuato l'accesso come Utente normale senza autorizzazione DBA, è possibile utilizzare il comando seguente per visualizzare tutte le tabelle e le viste del proprio schema.

select * from tab;

3

Prova questo, sostituisci? con il nome del tuo schema

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'

3
Questo è più indipendente dal database e quindi penso che questo tipo di soluzione sia migliore di tutte le alternative. Penso che INFORMATION_SCHEMA funzioni su quasi tutti i principali database che ho visto. Anche se alcuni differiscono nelle informazioni che puoi ottenere, almeno è un posto coerente in cui cercare. Tuttavia, facendo una rapida ricerca su Internet, sembra che Oracle sia praticamente l'unico database a non supportare Information_Schema, anche se fa parte dello standard SQL-92.
Kibbee,

2

Se si accede a Oracle con JDBC (Java), è possibile utilizzare la classe DatabaseMetadata . Se si accede a Oracle con ADO.NET, è possibile utilizzare un approccio simile.

Se si accede a Oracle con ODBC, è possibile utilizzare la funzione SQLTables .

Altrimenti, se hai solo bisogno delle informazioni in SQLPlus o client Oracle simile, una delle query già menzionate lo farà. Per esempio:

select TABLE_NAME from user_tables

2
select * from cat;

mostrerà tutte le tabelle nel sinonimo cat schema di user_catalog


2
select TABLE_NAME from user_tables;

La query sopra ti darà i nomi di tutte le tabelle presenti in quell'utente;


2
select * from user_tables;

(mostra tutte le tabelle)


1

SELEZIONA table_name, proprietario FROM all_tables dove owner = 'schema_name' ordina per table_name


1

È possibile eseguire direttamente la seconda query se si conosce il nome del proprietario.

- In primo luogo è possibile selezionare ciò che tutti i PROPRIETARI esistono:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

--Poi puoi vedere le tabelle in basso da quel proprietario:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');


0

Se devi ottenere anche le dimensioni del tavolo, questo sarà utile:

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


0

Nome della tabella e contatore delle righe per tutte le tabelle nello OWNERschema:

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

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.