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?

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'

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

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

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;

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'

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

2
select * from cat;

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


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;


2
select * from user_tables;

(montrant tous les tableaux)


1

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


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


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


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'

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.