Oracle SQL'deki bir şemadaki tüm tabloları nasıl listeleyebilirim?


159

Oracle SQL'deki bir şemadaki tüm tabloları nasıl listeleyebilirim?

Yanıtlar:


220

Başka bir şemadaki tüm tabloları görmek için, aşağıdaki sistem ayrıcalıklarından birine veya daha fazlasına sahip olmanız gerekir:

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

veya büyük çekiç, DBA rolü.

Bunlardan herhangi biriyle şunları seçebilirsiniz:

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

Bu sistem ayrıcalıkları olmadan, doğrudan veya bir rol aracılığıyla yalnızca size belirli düzeyde erişim izni verilen tabloları görebilirsiniz.

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

Son olarak, tablolarınıza ilişkin haklarınız iptal edilemediğinden (10 g'dan itibaren) kendi tablolarınız için veri sözlüğünü her zaman sorgulayabilirsiniz:

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

2
%_OBJECTSbunun yerine kullanımı dışında "en eksiksiz cevap" %_TABLES.
APC

9i'de görüntülemelerin% _TABLES içinde listelendiğini hatırlıyorum - örneğin, bir şemayı boşaltmayı otomatikleştirmeye çalışmak DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS atma hataları gibi ifadelerle sonuçlanır. Bu nedenle, MINUS / NOT IN / NOT EXISTS ile görünümleri kaldırmanız veya% _OBJECTS hedefine gitmeniz gerekir. Ayrıca,% _OBJECTS aleyhine gitmek, içinde başka ne olabileceğine dair etkileyici bir ipucu bırakır!
Adam Musch

1
DISTINCTSorguda kesinlikle gerek yoktur . owner, object_namebenzersizdirALL_OBJECTS
a_horse_with_no_name

1
Bu sorguların farklı olması gerekmez, bu doğrudur; ancak, owner, object_namedba_objects'teki hiçbir yöntemle benzersiz değildir; Paket Gövdeleri ve Paketler bu görünümde görünür ve Tablolar ve Dizinler farklı ad alanlarındadır.
Adam Musch

Son sorgu XE 11.2'deki gibi çalışmaz. Görünüşe göre 'user_objects' içinde 'sahip' sütunu yok.
Rafael Chaves

71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';

2
Bu, YOURSCHEMA tarafından çalıştırılırsa veya Adam Musch tarafından belirtilen ayrıcalıklara sahip bir kullanıcı tarafından çalıştırılırsa, YOURSCHEMA'daki tüm tabloları gösterir . Aksi takdirde sadece kendinize ayrıcalık verildiği tabloları gösterir.
APC

14

Sorgulayabilirsiniz USER_TABLES

select TABLE_NAME from user_tables

5
Bu, ŞEMANIZdaki tüm tablolar, A şemasındaki tüm tablolar değil. Ayrıca, * _TABLES veri sözlüğü görünümleri (DBA_TABLES, ALL_TABLES, USER_TABLES) görünümler içerir.
Adam Musch

"görünümleri dahil et" yerine "Oracle'ın seme sürümlerinde görünümler içerebilir".
Adam Musch

@Adam Musch Oracle 10g R2 kullanılarak test edildi, görünüm döndürmedi.
Sathyajith Bhat

4

DBA izni olmadan Normal Kullanıcı olarak oturum açtıysanız, kendi şemanızın tüm tablolarını ve görünümlerini görmek için aşağıdaki komutu kullanabilirsiniz.

select * from tab;

3

Bunu dene, değiştir? şema adınızla

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

3
Bu daha fazla veritabanı agnostik, ve bu yüzden bu tür bir çözümün tüm alternatiflere göre daha iyi olduğunu düşünüyorum. BİLGİ_SCHEMA, gördüğüm hemen hemen her büyük veritabanı üzerinde çalışıyor. Bazıları hangi bilgileri elde edebileceğiniz konusunda farklılık gösterse de, en azından bakmak için tutarlı bir yer. Ancak hızlı bir internet araması yaparak, Oracle, SQL-92 standardının bir parçası olmasına rağmen, Information_Schema'yı desteklemeyen tek veritabanı hakkında görünüyor.
Kibbee

2

Oracle'a JDBC (Java) ile erişiyorsanız DatabaseMetadata sınıfını kullanabilirsiniz . Oracle'a ADO.NET ile erişiyorsanız benzer bir yaklaşım kullanabilirsiniz.

Oracle'a ODBC ile erişiyorsanız, SQLTables işlevini kullanabilirsiniz .

Aksi takdirde, SQLPlus veya benzeri bir Oracle istemcisindeki bilgilere ihtiyacınız varsa, daha önce bahsedilen sorgulardan biri olacaktır. Örneğin:

select TABLE_NAME from user_tables

2
select * from cat;

user_catalog şema cat eşanlamındaki tüm tabloları gösterecektir


2
select TABLE_NAME from user_tables;

Yukarıdaki sorgu size bu kullanıcıdaki tüm tabloların adlarını verecektir;


2
select * from user_tables;

(tüm tablolar gösteriliyor)


1

SELECT table_name, sahip FROM all_tables burada owner = 'schema_name' sipariş table_name tarafından


1

Sahip adını biliyorsanız doğrudan ikinci sorguyu çalıştırabilirsiniz.

- İlk önce orada bulunan tüm SAHİPLERİNİ seçebilirsiniz:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

- Daha sonra bu sahibin altındaki tabloları görebilirsiniz:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');


0

Tablonun boyutunu da almanız gerekiyorsa, bu kullanışlı olacaktır:

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


0

OWNERŞema altındaki tüm tablolar için tablonun ve satır sayacının adı :

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.