Bagaimana cara mendaftar semua tabel dalam skema di Oracle SQL?

159

Bagaimana cara membuat daftar semua tabel dalam skema di Oracle SQL?

benstpierre
sumber

Jawaban:

220

Untuk melihat semua tabel dalam skema lain, Anda perlu memiliki satu atau lebih hak istimewa sistem berikut:

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

atau palu besar, peran DBA.

Dengan semua itu, Anda dapat memilih:

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

Tanpa hak istimewa sistem tersebut, Anda hanya dapat melihat tabel yang telah Anda berikan aksesnya, baik secara langsung atau melalui peran.

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

Terakhir, Anda selalu dapat meminta kamus data untuk tabel Anda sendiri, karena hak Anda untuk tabel Anda tidak dapat dicabut (hingga 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
Adam Musch
sumber
2
"jawaban paling lengkap" selain dari penggunaan %_OBJECTSalih-alih %_TABLES.
APC
Saya ingat di 9i bahwa pandangan akan terdaftar di% _TABLES - jadi, misalnya, mencoba mengotomatiskan suatu skema akan berakhir dengan pernyataan seperti DROP TABLE REALLY_A_VIEW KENDALA CASCADE CONSTRAINTS melempar kesalahan. Jadi Anda harus menghapus view dengan MINUS / NOT IN / NOT EXISTS atau go agains% _OBJECTS. Plus, menentang% _OBJECTS memberi petunjuk yang menggiurkan tentang apa lagi yang ada di sana!
Adam Musch
1
Sama sekali tidak perlu untuk DISTINCTdi kueri. owner, object_nameunik diALL_OBJECTS
a_horse_with_no_name
1
Pertanyaan itu tidak perlu berbeda, itu benar; namun, owner, object_nametidak unik dengan cara apa pun di dba_objects; Paket Badan dan Paket keduanya muncul dalam tampilan itu, dan Tabel dan Indeks berada dalam ruang nama yang berbeda.
Adam Musch
Kueri terakhir tidak akan berfungsi seperti pada XE 11.2. Sepertinya tidak ada kolom 'pemilik' di 'user_objects'.
Rafael Chaves
71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';
Tom
sumber
2
Ini hanya akan menampilkan semua tabel di YOURSCHEMA jika dijalankan oleh YOURSCHEMA atau dijalankan oleh pengguna dengan hak istimewa yang disebutkan oleh Adam Musch. Kalau tidak, itu hanya menunjukkan tabel di YOURSCHEMA yang telah diberikan hak istimewa kepada kami.
APC
14

Anda bisa bertanya USER_TABLES

select TABLE_NAME from user_tables
Sathyajith Bhat
sumber
5
Itu semua tabel dalam skema ANDA, tidak semua tabel dalam skema A. Juga, * _TABLES tampilan kamus data (DBA_TABLES, ALL_TABLES, USER_TABLES) termasuk tampilan.
Adam Musch
ganti "sertakan tampilan" dengan "dapat sertakan tampilan dalam versi seme Oracle."
Adam Musch
@Adam Musch Diuji menggunakan Oracle 10g R2, itu tidak mengembalikan tampilan.
Sathyajith Bhat
4

Jika Anda masuk sebagai Pengguna Normal tanpa izin DBA, Anda dapat menggunakan perintah berikut untuk melihat semua tabel dan tampilan skema Anda sendiri.

select * from tab;
chan
sumber
3

Coba ini, ganti? dengan nama skema Anda

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'
SQLMenace
sumber
3
Ini lebih agnostik basis data, jadi saya pikir jenis solusi ini lebih baik daripada semua alternatif. Saya pikir INFORMATION_SCHEMA bekerja pada hampir setiap basis data utama yang saya lihat. Meskipun beberapa berbeda dalam informasi apa yang bisa Anda dapatkan, setidaknya itu adalah tempat yang konsisten untuk mencari. Namun dari melakukan pencarian internet cepat, tampaknya Oracle hanyalah satu-satunya basis data yang tidak mendukung Information_Schema, meskipun itu merupakan bagian dari standar SQL-92.
Kibbee
2

Jika Anda mengakses Oracle dengan JDBC (Java), Anda dapat menggunakan kelas DatabaseMetadata . Jika Anda mengakses Oracle dengan ADO.NET, Anda dapat menggunakan pendekatan serupa.

Jika Anda mengakses Oracle dengan ODBC, Anda dapat menggunakan fungsi SQLTables .

Jika tidak, jika Anda hanya memerlukan informasi dalam SQLPlus atau klien Oracle serupa, salah satu pertanyaan yang sudah disebutkan akan dilakukan. Misalnya:

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

itu akan menampilkan semua tabel di kucing skema Anda sinonim dari user_catalog

Arsalan Sheikh
sumber
2
select TABLE_NAME from user_tables;

Kueri di atas akan memberi Anda nama semua tabel yang ada di pengguna itu;

AA Nayak
sumber
2
select * from user_tables;

(menunjukkan semua tabel)

yash
sumber
1

SELECT table_name, owner FROM all_tables di mana owner = 'schema_name' pesan berdasarkan table_name

Sreeju
sumber
1

Anda bisa langsung menjalankan kueri kedua jika Anda tahu nama pemiliknya.

--Pertama Anda dapat memilih semua pemilik yang ada:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

--Lalu Anda dapat melihat tabel di bawah oleh pemilik itu:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');
Kermit si Katak
sumber
0

Jika Anda perlu mendapatkan ukuran meja juga, ini akan berguna:

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

Vijay Kumar
sumber
0

Nama tabel dan penghitung baris untuk semua tabel dalam OWNERskema:

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

SergioLeone
sumber