Wie liste ich alle Tabellen in einem Schema in Oracle SQL auf?

158

Wie liste ich alle Tabellen in einem Schema in Oracle SQL auf?

benstpierre
quelle

Antworten:

219

Um alle Tabellen in einem anderen Schema anzuzeigen, müssen Sie über eine oder mehrere der folgenden Systemberechtigungen verfügen:

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

oder der große Hammer, die DBA-Rolle.

Mit einem dieser Optionen können Sie Folgendes auswählen:

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

Ohne diese Systemberechtigungen können Sie nur Tabellen anzeigen, auf die Sie direkt oder über eine Rolle Zugriff haben.

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

Schließlich können Sie das Datenwörterbuch jederzeit nach Ihren eigenen Tabellen abfragen, da Ihre Rechte an Ihren Tabellen nicht widerrufen werden können (ab 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
Adam Musch
quelle
2
die "vollständigste Antwort" abgesehen von der Verwendung von %_OBJECTSstatt %_TABLES.
APC
Ich erinnere mich, dass in 9i Ansichten in% _TABLES aufgelistet waren. Wenn Sie beispielsweise versuchen, das Leeren eines Schemas zu automatisieren, werden Anweisungen wie DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS Fehler auslösen. Sie müssten also entweder die Ansichten mit MINUS / NOT IN / NOT EXISTS entfernen oder gegen% _OBJECTS gehen. Wenn Sie gegen% _OBJECTS vorgehen, bleibt ein verlockender Hinweis darauf, was sonst noch drin sein könnte!
Adam Musch
1
Es besteht absolut keine Notwendigkeit für die DISTINCTin der Abfrage. owner, object_nameist einzigartig inALL_OBJECTS
a_horse_with_no_name
1
Diese Abfragen müssen nicht eindeutig sein, das stimmt. ist jedoch owner, object_namein dba_objects keineswegs eindeutig; In dieser Ansicht werden sowohl Paketkörper als auch Pakete angezeigt, und Tabellen und Indizes befinden sich in unterschiedlichen Namespaces.
Adam Musch
Die letzte Abfrage funktioniert nicht wie in XE 11.2. Es gibt anscheinend keine 'Eigentümer'-Spalte in' user_objects '.
Rafael Chaves
71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';
Tom
quelle
2
Dies zeigt nur alle Tabellen in YOURSCHEMA an, wenn sie von YOURSCHEMA oder von einem Benutzer mit den von Adam Musch genannten Berechtigungen ausgeführt werden. Andernfalls werden nur die Tabellen in YOURSCHEMA angezeigt, für die wir Berechtigungen erhalten haben.
APC
14

Sie können abfragen USER_TABLES

select TABLE_NAME from user_tables
Sathyajith Bhat
quelle
5
Das sind alle Tabellen in IHREM Schema, nicht alle Tabellen in A-Schema. Außerdem enthalten die Datenwörterbuchansichten * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) Ansichten.
Adam Musch
Ersetzen Sie "Ansichten einschließen" durch "Ansichten in Semi-Versionen von Oracle einschließen".
Adam Musch
@Adam Musch Getestet mit Oracle 10g R2, gab es keine Ansichten zurück.
Sathyajith Bhat
4

Wenn Sie sich als normaler Benutzer ohne DBA-Berechtigung angemeldet haben, können Sie den folgenden Befehl verwenden, um alle Tabellen und Ansichten Ihres eigenen Schemas anzuzeigen.

select * from tab;
Chan
quelle
3

Versuchen Sie dies, ersetzen Sie? mit Ihrem Schemanamen

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'
SQLMenace
quelle
3
Dies ist datenbankunabhängiger, und daher denke ich, dass diese Art von Lösung gegenüber allen Alternativen besser ist. Ich denke, INFORMATION_SCHEMA funktioniert mit fast jeder wichtigen Datenbank, die ich gesehen habe. Obwohl sich einige darin unterscheiden, welche Informationen Sie herausholen können, ist es zumindest ein konsistenter Ort, um nachzuschauen. Bei einer schnellen Internetsuche scheint Oracle jedoch die einzige Datenbank zu sein, die Information_Schema nicht unterstützt, obwohl es Teil des SQL-92-Standards ist.
Kibbee
2

Wenn Sie mit JDBC (Java) auf Oracle zugreifen, können Sie die DatabaseMetadata- Klasse verwenden. Wenn Sie mit ADO.NET auf Oracle zugreifen, können Sie einen ähnlichen Ansatz verwenden.

Wenn Sie mit ODBC auf Oracle zugreifen, können Sie die SQLTables- Funktion verwenden.

Andernfalls reicht eine der bereits erwähnten Abfragen aus, wenn Sie nur die Informationen in SQLPlus oder einem ähnlichen Oracle-Client benötigen. Zum Beispiel:

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

Es werden alle Tabellen in Ihrem Schemakatzen-Synonym für user_catalog angezeigt

Arsalan Sheikh
quelle
2
select TABLE_NAME from user_tables;

Die obige Abfrage gibt Ihnen die Namen aller in diesem Benutzer vorhandenen Tabellen.

AA Nayak
quelle
2
select * from user_tables;

(zeigt alle Tabellen)

yash
quelle
1

SELECT Tabellenname, Eigentümer FROM all_tables wobei Eigentümer = 'Schemaname' nach Tabellenname sortiert

Sreeju
quelle
1

Sie können die zweite Abfrage direkt ausführen, wenn Sie den Eigentümernamen kennen.

- Zuerst können Sie auswählen, welche EIGENTÜMER es gibt:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

- Dann können Sie die Tabellen unter diesem Eigentümer sehen:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');
Kermit der Frosch
quelle
0

Wenn Sie auch die Größe des Tisches benötigen, ist dies praktisch:

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

Vijay Kumar
quelle
0

Name des Tabellen- und Zeilenzählers für alle Tabellen im OWNERSchema:

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

SergioLeone
quelle