¿Cómo enumero todas las tablas en un esquema en Oracle SQL?

159

¿Cómo enumero todas las tablas en un esquema en Oracle SQL?

benstpierre
fuente

Respuestas:

220

Para ver todas las tablas en otro esquema, debe tener uno o más de los siguientes privilegios del sistema:

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

o el gran martillo, el papel de DBA.

Con cualquiera de esos, puede seleccionar:

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

Sin esos privilegios del sistema, solo puede ver las tablas a las que se le ha otorgado algún nivel de acceso, ya sea directamente o mediante un rol.

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

Por último, siempre puede consultar el diccionario de datos para sus propias tablas, ya que sus derechos sobre sus tablas no se pueden revocar (a partir de 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
Adam Musch
fuente
2
la "respuesta más completa", aparte de su uso de en %_OBJECTSlugar de %_TABLES.
APC
Recuerdo en 9i que las vistas aparecerían en% _TABLES, por lo que, por ejemplo, tratar de automatizar el vaciado de un esquema terminaría con declaraciones como DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS arrojando errores. Por lo tanto, tendría que eliminar las vistas con MENOS / NO EN / NO EXISTE o ir contra% _OBJECTS. Además, ir en contra de% _OBJECTS deja una pista tentadora de lo que podría haber allí.
Adam Musch
1
No hay absolutamente ninguna necesidad de DISTINCTen la consulta. owner, object_namees único enALL_OBJECTS
a_horse_with_no_name
1
Esas consultas no necesitan distintas, eso es cierto; sin embargo, owner, object_nameno es único de ninguna manera en dba_objects; Los cuerpos de paquete y los paquetes aparecen en esa vista, y las tablas e índices están en diferentes espacios de nombres.
Adam Musch
La última consulta no funcionará como está en XE 11.2. Parece que no hay una columna 'propietario' en 'user_objects'.
Rafael Chaves
71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';
Tom
fuente
2
Esto solo mostrará todas las tablas en YOURSCHEMA si lo ejecuta YOURSCHEMA o si lo ejecuta un usuario con los privilegios mencionados por Adam Musch. De lo contrario, solo muestra las tablas en YOURSCHEMA a las que se nos han otorgado privilegios.
APC
14

Puedes consultar USER_TABLES

select TABLE_NAME from user_tables
Sathyajith Bhat
fuente
55
Esas son todas las tablas en SU ​​esquema, no todas las tablas en el esquema A. Además, las vistas de diccionario de datos * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) incluyen vistas.
Adam Musch
reemplace "incluir vistas" con "puede incluir vistas en seme versiones de Oracle".
Adam Musch
@ Adam Musch Probado con Oracle 10g R2, no devolvió las vistas.
Sathyajith Bhat
4

Si inició sesión como Usuario normal sin permiso de DBA, puede usar el siguiente comando para ver todas las tablas y vistas de su propio esquema.

select * from tab;
chan
fuente
3

Intenta esto, ¿reemplazar? con tu nombre de esquema

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'
SQLMenace
fuente
3
Esto es más independiente de la base de datos, por lo que creo que este tipo de solución es mejor que todas las alternativas. Creo que INFORMATION_SCHEMA funciona en casi todas las bases de datos principales que he visto. Aunque algunos difieren en la información que puede obtener, al menos es un lugar consistente para buscar. Sin embargo, al realizar una búsqueda rápida en Internet, parece que Oracle es la única base de datos que no admite Information_Schema, a pesar de que es parte del estándar SQL-92.
Kibbee
2

Si accede a Oracle con JDBC (Java), puede usar la clase DatabaseMetadata . Si está accediendo a Oracle con ADO.NET, puede usar un enfoque similar.

Si está accediendo a Oracle con ODBC, puede usar la función SQLTables .

De lo contrario, si solo necesita la información en SQLPlus o un cliente de Oracle similar, una de las consultas ya mencionadas servirá. Por ejemplo:

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

mostrará todas las tablas en su sinónimo de gato de esquema de user_catalog

Arsalan Sheikh
fuente
2
select TABLE_NAME from user_tables;

La consulta anterior le dará los nombres de todas las tablas presentes en ese usuario;

AA Nayak
fuente
2
select * from user_tables;

(mostrando todas las tablas)

yash
fuente
1

SELECCIONA table_name, owner FROM all_tables donde owner = 'schema_name' ordena por table_name

Sreeju
fuente
1

Puede ejecutar directamente la segunda consulta si conoce el nombre del propietario.

--Primero puede seleccionar qué existen todos los PROPIETARIOS que existen:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

- Entonces puede ver las tablas debajo de ese propietario:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');
Kermit la rana
fuente
0

Si necesita obtener el tamaño de la tabla también, esto será útil:

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

Vijay Kumar
fuente
0

Nombre de la tabla y el contador de filas para todas las tablas bajo OWNEResquema:

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

SergioLeone
fuente