Comment répertorier toutes les tables d'un schéma dans Oracle SQL?

159

Comment répertorier toutes les tables d'un schéma dans Oracle SQL?

Benstpierre
la source

Réponses:

220

Pour voir toutes les tables d'un autre schéma, vous devez disposer d'un ou plusieurs des privilèges système suivants:

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

ou le gros marteau, le rôle du DBA.

Avec l'un de ceux-ci, vous pouvez sélectionner:

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

Sans ces privilèges système, vous ne pouvez voir que les tables auxquelles vous avez obtenu un certain niveau d'accès, que ce soit directement ou via un rôle.

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

Enfin, vous pouvez toujours interroger le dictionnaire de données pour vos propres tables, car vos droits sur vos tables ne peuvent pas être révoqués (à partir de 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
Adam Musch
la source
2
la "réponse la plus complète" en dehors de son utilisation de %_OBJECTSau lieu de %_TABLES.
APC
Je me souviens dans 9i que les vues seraient répertoriées dans% _TABLES - ainsi, par exemple, essayer d'automatiser le vidage d'un schéma aboutirait à des instructions comme DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS lançant des erreurs. Vous devez donc soit supprimer les vues avec MOINS / NON DANS / NON EXISTANT, soit revenir à% _OBJECTS. De plus, aller à l'encontre de% _OBJECTS laisse un indice alléchant de ce qu'il pourrait y avoir d'autre!
Adam Musch
1
Il n'est absolument pas nécessaire d'utiliser le DISTINCTdans la requête. owner, object_nameest unique dansALL_OBJECTS
a_horse_with_no_name
1
Ces requêtes n'ont pas besoin d'être distinctes, c'est vrai; cependant, owner, object_namen'est en aucun cas unique dans dba_objects; Les corps de package et les packages apparaissent tous les deux dans cette vue, et les tables et les index sont dans des espaces de noms différents.
Adam Musch
La dernière requête ne fonctionnera pas comme dans XE 11.2. Il n'y a pas de colonne "owner" dans "user_objects" semble-t-il.
Rafael Chaves
71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';
À M
la source
2
Cela affichera uniquement toutes les tables de YOURSCHEMA si elles sont exécutées par YOURSCHEMA ou exécutées par un utilisateur avec les privilèges mentionnés par Adam Musch. Sinon, il ne montre que les tables de YOURSCHEMA sur lesquelles nous avons obtenu des privilèges.
APC
14

Vous pouvez interroger USER_TABLES

select TABLE_NAME from user_tables
Sathyajith Bhat
la source
5
Ce sont toutes les tables de VOTRE schéma, pas toutes les tables d'un schéma. En outre, les vues du dictionnaire de données * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) incluent des vues.
Adam Musch
remplacer «inclure des vues» par «peut inclure des vues dans des versions semes d'Oracle».
Adam Musch
@Adam Musch Testé avec Oracle 10g R2, il n'a pas renvoyé de vues.
Sathyajith Bhat
4

Si vous vous êtes connecté en tant qu'utilisateur normal sans l'autorisation DBA, vous pouvez utiliser la commande suivante pour voir toutes les tables et vues de votre propre schéma.

select * from tab;
chan
la source
3

Essayez ceci, remplacez? avec le nom de votre schéma

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'
SQLMenace
la source
3
C'est plus indépendant de la base de données, et je pense donc que ce type de solution est meilleur que toutes les alternatives. Je pense que INFORMATION_SCHEMA fonctionne sur à peu près toutes les principales bases de données que j'ai vues. Bien que certains diffèrent dans les informations que vous pouvez obtenir, au moins c'est un endroit cohérent à regarder. Cependant, après avoir effectué une recherche rapide sur Internet, il semble qu'Oracle soit à peu près la seule base de données à ne pas prendre en charge Information_Schema, même si elle fait partie de la norme SQL-92.
Kibbee
2

Si vous accédez à Oracle avec JDBC (Java), vous pouvez utiliser la classe DatabaseMetadata . Si vous accédez à Oracle avec ADO.NET, vous pouvez utiliser une approche similaire.

Si vous accédez à Oracle avec ODBC, vous pouvez utiliser la fonction SQLTables .

Sinon, si vous avez juste besoin des informations dans SQLPlus ou un client Oracle similaire, l'une des requêtes déjà mentionnées fera l'affaire. Par exemple:

select TABLE_NAME from user_tables
Pablo Santa Cruz
la source
2
select * from cat;

il affichera toutes les tables de votre schéma cat synonyme de user_catalog

Arsalan Sheikh
la source
2
select TABLE_NAME from user_tables;

La requête ci-dessus vous donnera les noms de toutes les tables présentes dans cet utilisateur;

AA Nayak
la source
2
select * from user_tables;

(montrant tous les tableaux)

yash
la source
1

SELECT table_name, owner FROM all_tables where owner = 'schema_name' order by table_name

Sreeju
la source
1

Vous pouvez exécuter directement la deuxième requête si vous connaissez le nom du propriétaire.

- Vous pouvez d'abord sélectionner ce que tous les PROPRIÉTAIRES existent:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

- Ensuite, vous pouvez voir les tableaux ci-dessous par ce propriétaire:

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

Si vous avez également besoin d'obtenir la taille de la table, ce sera pratique:

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

Vijay Kumar
la source
0

Nom de la table et du compteur de lignes pour toutes les tables sous OWNERschéma:

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

SergioLeone
la source