2010-02-11 30 views

Respuesta

166

Para ver todas las tablas en otro esquema, es necesario 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 ellos, puede seleccionar:

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

Sin esos privilegios del sistema, sólo se puede ver tablas se le ha concedido un cierto nivel de acceso a, ya sea directamente oa través de un papel.

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

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

SELECT DISTINCT OBJECT_NAME 
    FROM USER_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
+2

la "respuesta más completa" aparte de su uso de '% _OBJECTS' en lugar de'% _TABLES'. – APC

+0

Recuerdo en el 9i que las vistas se enumerarían en% _TABLES, por lo que, por ejemplo, tratar de automatizar el vaciado de un esquema terminaría con sentencias como DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS arrojando errores. Por lo tanto, tendrá que eliminar las vistas con MINUS/NOT IN/NOT EXISTS o avanzar% _OBJECTS. Además, ¡ir en contra de% _OBJECTS deja una sugerencia tentadora de qué más podría estar ahí! –

+1

No hay absolutamente ninguna necesidad de 'DISTINCT' en la consulta. 'owner, object_name' es único en' ALL_OBJECTS' –

11

Puede consultar USER_TABLES

select TABLE_NAME from user_tables 
+4

Esas son todas las tablas en SU ​​esquema, no todas las tablas en el esquema A. Además, las vistas del diccionario de datos * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) incluyen vistas. –

+0

reemplazar "incluir vistas" con "puede incluir vistas en versiones similares de Oracle". –

+0

@ Adam Musch Probado usando Oracle 10g R2, no devolvió las vistas. – Sathya

3

probar esto, reemplazar? con su nombre de esquema

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

Esto es más agnóstico de 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 principales bases de datos que he visto. Aunque algunos difieren en la información que puede obtener, al menos es un lugar consistente para buscar. Sin embargo, al hacer una búsqueda rápida en Internet, parece que Oracle es la única base de datos que no admite Information_Schema, aunque es parte del estándar SQL-92. – Kibbee

+5

Por supuesto, OP pidió específicamente una solución de Oracle ... – DCookie

52
SELECT table_name from all_tables where owner = 'YOURSCHEMA'; 
+4

El schemanaame debería estar en MAYÚSCULAS –

+2

Esto solo mostrará * todas * las tablas en YOURSCHEMA si las ejecuta YOURSCHEMA o las 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

2

Si accede a Oracle con JDBC (Java) se puede utilizar DatabaseMetadata clase. 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 u otro cliente Oracle similar, una de las consultas ya mencionadas lo hará. Por ejemplo:

select TABLE_NAME from user_tables 
4

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

select * from tab; 
1
select * from cat; 

se mostrará todas las tablas en el esquema de sinónimos gato de user_catalog

0
select TABLE_NAME from user_tables; 

Por encima de consulta le dará los nombres de todas las tablas presentes en ese usuario;

2
select * from user_tables; 

(mostrando todas las tablas)

0

Si usted necesita para obtener el tamaño de la mesa, así, esto será muy útil:

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

1

nombre_tabla SELECT, dueño DE all_tables donde owner = 'schema_name' order por table_name

Cuestiones relacionadas