¿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?

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'

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

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

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;

3

Intenta esto, ¿reemplazar? con tu nombre de esquema

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

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

2
select * from cat;

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


2
select TABLE_NAME from user_tables;

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


2
select * from user_tables;

(mostrando todas las tablas)


1

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


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


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


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'

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.