Oracle SQLのスキーマ内のすべてのテーブルをリストするにはどうすればよいですか?


158

Oracle SQLのスキーマ内のすべてのテーブルをリストするにはどうすればよいですか?

回答:


219

別のスキーマのすべてのテーブルを表示するには、次のシステム権限の1つ以上が必要です。

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

または大きなハンマー、DBAの役割。

これらのいずれかを使用すると、以下を選択できます。

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

これらのシステム権限がないと、直接またはロールを介してアクセスできる、あるレベルのアクセス権が付与されているテーブルのみを表示できます。

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

最後に、テーブルへの権限を取り消すことはできないため(10g以降)、いつでもデータディクショナリに独自のテーブルをクエリできます。

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

2
%_OBJECTS代わりにを使用することを除いて、「最も完全な答え」%_TABLES
APC

9iでは、ビューが%_TABLESにリストされることを覚えています-たとえば、スキーマを自動的に空にしようとすると、エラーがスローされるDROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTSのようなステートメントになります。したがって、MINUS / NOT IN / NOT EXISTSでビューを削除するか、%_ OBJECTSを再度実行する必要があります。さらに、%_ OBJECTSに反対すると、そこに他に何があるのか​​についての食欲をそそるヒントが残ります!
Adam Musch、

1
DISTINCTクエリでの必要はまったくありません。owner, object_nameALL_OBJECTS
-a_horse_with_no_nameで

1
これらのクエリは明確である必要はありません。ただし、owner, object_namedba_objects内では決して一意ではありません。パッケージボディとパッケージの両方がそのビューに表示され、テーブルとインデックスは異なる名前空間にあります。
Adam Musch

最後のクエリはXE 11.2のように機能しません。「user_objects」に「所有者」列がないようです。
Rafael Chaves

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

2
YOURSCHEMAによって実行された場合、またはAdam Muschによって言及された特権を持つユーザーによって実行された場合、これはYOURSCHEMA内のすべてのテーブルのみを表示します。それ以外の場合は、特権が付与されているYOURSCHEMA内のテーブルのみが表示されます。
APC

14

クエリできます USER_TABLES

select TABLE_NAME from user_tables

5
それはあなたのスキーマのすべてのテーブルであり、Aスキーマのすべてのテーブルではありません。また、* _ TABLESデータディクショナリビュー(DBA_TABLES、ALL_TABLES、USER_TABLES)にはビューが含まれます。
アダムムッシュ

「ビューを含める」を「Oracleのsemeバージョンにビューを含めることができる」に置き換えます。
Adam

@Adam MuschはOracle 10g R2を使用してテストされ、ビューを返しませんでした。
Sathyajith Bhat

4

DBA権限なしで通常のユーザーとしてログインした場合は、次のコマンドを使用して、自分のスキーマのすべてのテーブルとビューを表示できます。

select * from tab;

3

これを試して、置き換えますか?スキーマ名

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

3
これはデータベースにとらわれないので、このタイプのソリューションはすべての選択肢よりも優れていると思います。INFORMATION_SCHEMAは、私が見たほとんどすべての主要なデータベースで機能すると思います。取得できる情報は一部異なりますが、少なくとも一貫して確認できる場所です。ただし、クイックインターネット検索を行ったところ、SQL-92標準の一部であるにもかかわらず、OracleはInformation_Schemaをサポートしない唯一のデータベースであるようです。
キブビー

2

JDBC(Java)でOracleにアクセスする場合は、DatabaseMetadataクラスを使用できます。ADO.NETでOracleにアクセスしている場合は、同様のアプローチを使用できます。

ODBCを使用してOracleにアクセスしている場合は、SQLTables関数を使用できます。

それ以外の場合、SQLPlusまたは同様のOracleクライアントの情報が必要なだけであれば、すでに述べたクエリの1つで十分です。例えば:

select TABLE_NAME from user_tables


2
select TABLE_NAME from user_tables;

上記のクエリは、そのユーザーに存在するすべてのテーブルの名前を提供します。




1

所有者名がわかっている場合は、2番目のクエリを直接実行できます。

-まず、存在するすべての所有者を選択できます。

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

-次に、その所有者のテーブルを確認できます。

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


0

テーブルのサイズも取得する必要がある場合は、これが便利です。

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


0

OWNERスキーマの下のすべてのテーブルのテーブルと行のカウンターの名前:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.