Oracle SQLのスキーマ内のすべてのテーブルをリストするにはどうすればよいですか?
Oracle SQLのスキーマ内のすべてのテーブルをリストするにはどうすればよいですか?
回答:
別のスキーマのすべてのテーブルを表示するには、次のシステム権限の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'
DISTINCT
クエリでの必要はまったくありません。owner, object_name
ALL_OBJECTS
owner, object_name
dba_objects内では決して一意ではありません。パッケージボディとパッケージの両方がそのビューに表示され、テーブルとインデックスは異なる名前空間にあります。
クエリできます USER_TABLES
select TABLE_NAME from user_tables
これを試して、置き換えますか?スキーマ名
select TABLE_NAME from INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA =?
AND TABLE_TYPE = 'BASE TABLE'
JDBC(Java)でOracleにアクセスする場合は、DatabaseMetadataクラスを使用できます。ADO.NETでOracleにアクセスしている場合は、同様のアプローチを使用できます。
ODBCを使用してOracleにアクセスしている場合は、SQLTables関数を使用できます。
それ以外の場合、SQLPlusまたは同様のOracleクライアントの情報が必要なだけであれば、すでに述べたクエリの1つで十分です。例えば:
select TABLE_NAME from user_tables
私の簡単なユーティリティを見て、dbスキーマに関する情報を表示します。これは、Oracleデータディクショナリを使用したデータモデルのリバースエンジニアリングに基づいています。
%_OBJECTS
代わりにを使用することを除いて、「最も完全な答え」%_TABLES
。