Info2softは、ウェブサイトでより快適で適切な閲覧体験を提供するためにCookieを使用しています。 プライバシーポリシー
Loading...
MySQLやPostgreSQLを使用する開発者は慣れからSHOW TABLES;または\dtを実行しがちですが、Oracleにはこれらのコマンドが実装されておらず、実行するとエラーが発生します。
Oracleではデータディクショナリという読み取り専用のシステムビュー群を利用してデータベース内の全メタデータを管理します。1行の簡略コマンドより記述量は多くなりますが、機能性が大幅に高いのが特徴です。テーブル名だけでなく、ストレージ情報、パーティション設定、レコード件数、統計情報の最終分析日などを同一クエリで取得可能です。
| データベース | テーブル一覧の取得方法 |
|---|---|
| MySQL | SHOW TABLES; |
| PostgreSQL | \dt または information_schema のクエリ実行 |
| Oracle | データディクショナリビューを参照(USER_TABLES、ALL_TABLES、DBA_TABLES) |
データディクショナリはアクセス権限に応じ3段階に分類されており、実行するビューはアカウントの参照権限によって使い分けます。詳細は後述します。
Oracleのデータディクショナリビューはテーブルの所有者と権限に基づき3種類に分かれています。クエリを作成する前に、自身のアカウントに適したビューを把握することが第一歩です。
自身のスキーマ内で作成したテーブルのみ確認したい場合はUSER_TABLESを使用します。自身のオブジェクトを扱う開発者が最も頻繁に利用するビューです。
SELECT table_name, tablespace_name, num_rows, last_analyzed
FROM user_tables
ORDER BY table_name;
num_rows(レコード件数)とlast_analyzed(統計最終取得日)を取得することで、テーブルにデータが存在するか、オプティマイザが最後に統計情報を収集したタイミングを瞬時に把握できます。
複数スキーマが存在する環境で、他ユーザーが作成し閲覧・編集権限を付与したテーブルを確認する場合はALL_TABLESを使用します。自身のテーブルに加え、アカウントにアクセス権限のある全テーブルを出力します。
特定のスキーマで絞り込むにはWHERE句を追加します:
SELECT owner, table_name, tablespace_name
FROM all_tables
WHERE owner = 'SALES_DEPT'
ORDER BY owner, table_name;
重要な注意点:Oracleはテーブル名・ユーザー名をデフォルトで大文字で保管します。WHERE owner = 'sales_dept'と小文字で記述すると検索結果が0件となります。引用符内は必ず大文字を使用してください。引用符付きで大文字小文字混在のスキーマを作成した場合のみ例外となります。
DBA_TABLESは全スキーマのすべてのテーブルを閲覧できるビューです。参照するにはDBAロール、またはSELECT ANY DICTIONARY権限が必要です。
Oracleには多くの内部システムスキーマが標準搭載されているため、そのままクエリを実行すると不要な情報が大量に出力されます。除外リストでフィルタリングします:
SELECT owner, table_name, tablespace_name
FROM dba_tables
WHERE owner NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'APPQOSSYS')
ORDER BY owner, table_name;
ORA-00942: 表またはビューが存在しません というエラーが出る場合、アカウントに必要な権限が付与されていません。DBAにSELECT_CATALOG_ROLEを付与してもらってください。このロールは完全なDBA権限を付与せず、ディクショナリビューの参照権限だけを許可する標準的な手段です。
標準クエリでは基本的なテーブル一覧しか取得できません。以下のクエリは列名、容量、部分一致したテーブル名から検索するといった高度な要件に対応し、用途に合わせて活用できます。
| 利用シナリオ | 参照するビュー | 必要な権限 |
|---|---|---|
| 列名からテーブルを検索 | ALL_TAB_COLUMNS | 標準権限 |
| レコード件数・統計最終分析日を確認 | USER_TABLES | 標準権限 |
| テーブル名の部分一致検索 | USER_TABLES | 標準権限 |
| 容量順にテーブルを表示 | DBA_SEGMENTS | DBAロール |
| システムスキーマを除外したテーブル一覧 | DBA_TABLES | DBAロール |
| GUIによる視覚的な確認 | SQL Developer / dbForge | 一般ユーザー権限 |
列名は分かっているが、どのテーブルで使用されているか不明な場合はALL_TAB_COLUMNSを参照します。多数の関連テーブルが存在する複雑なスキーマで特に便利です。
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE column_name = 'USER_ID'
ORDER BY owner, table_name;
Oracleのオプティマイザは統計情報を元に最適な実行計画を選択します。num_rowsの値が不正確、またはlast_analyzedが数ヶ月前の場合、明確なエラーなしにクエリのパフォーマンスが徐々に低下します。
SELECT table_name, num_rows, last_analyzed
FROM user_tables
WHERE num_rows > 0
ORDER BY num_rows DESC;
DBMS_STATS.GATHER_TABLE_STATSを実行してもらってください。テーブル名の一部しか覚えていない場合は、ワイルドカード%を伴うLIKE演算子を使用します。Oracleが識別子を大文字で保管する仕様のため、検索文字列は大文字で記述します。
SELECT table_name
FROM user_tables
WHERE table_name LIKE '%INVENTORY%';
Oracleのテーブルデータはセグメント単位で保存されるため、正確な容量を取得するにはDBA_SEGMENTSを参照する必要があります。以下のクエリは各テーブルの総容量をメガバイト単位で出力し、容量の大きい順に並び替えます。
SELECT segment_name AS table_name,
owner,
SUM(bytes) / 1024 / 1024 AS size_mb
FROM dba_segments
WHERE segment_type = 'TABLE'
GROUP BY segment_name, owner
ORDER BY size_mb DESC;
ストレージ監査やデータ移行前の大容量テーブル洗出しといった業務で活用できます。
DBA_TABLESをそのまま実行するとOracle標準の内部テーブルまで出力され、業務で必要な情報が埋もれてしまいます。フィルタリングにより業務テーブルのみを抽出します。
SELECT owner, table_name
FROM dba_tables
WHERE owner NOT IN (
'SYS', 'SYSTEM', 'OUTLN', 'DBSNMP',
'APPQOSSYS', 'CTXSYS', 'XDB', 'WMSYS'
)
ORDER BY owner, table_name;
業務スタイルに応じて適切なツールを選択します:
経験豊富なDBAでもOracleのデータディクショナリを参照する際、権限の問題や検索結果が空になるトラブルに遭遇します。代表的な4つの事例と解決策を記載します。
CREATE TABLE "Sales_Data"のように二重引用符付きでテーブルを作成すると、大文字小文字の表記がそのまま保持されます。'SALES_DATA'で検索しても結果が0件となります。SELECT * FROM "Sales_Data";ALTER SESSION SET CONTAINER = pdb_name;テーブル構造を把握した後、次に検討する課題は複数システム間でデータを保護・同期する方法です。本番環境でOracleを運用する企業には、大量トランザクション、スキーマ変更、マルチプラットフォーム環境に対応し、業務を停止させない安定したレプリケーション基盤が不可欠です。
i2Streamはこれらの課題に特化したエンタープライズ向けデータベースレプリケーションソリューションです。汎用的なレプリケーション製品と異なり、Oracle環境特有の課題に完全に適応した設計となっています。
レプリケーション以外に総合的なデータ耐性を確保したい企業には、Info2Softの製品ラインナップが対応します。i2Backupは物理・仮想・クラウド環境の一元バックアップを実現し、i2MigrationはOracleをはじめ各種システムの業務停止なしクロスプラットフォーム移行に対応します。
Q1:DBA権限なしでOracleのテーブル一覧を取得できますか?
可能です。USER_TABLESとALL_TABLESは特別な権限なしで一般ユーザーが参照できます。USER_TABLESは自身が所有するテーブル、ALL_TABLESはアクセス権限の付与された全テーブルを出力します。DBA_TABLESのみ高度な権限が必要となります。
Q2:USER_TABLESの結果が空になるのはなぜですか?
現在のユーザーが自身のテーブルを1つも保有していることが主な原因です。専用の接続アカウントや新規作成ユーザーの場合はALL_TABLESを参照し、自身にアクセス権限のあるオブジェクトを確認してください。
Q3:USER_TABLES、ALL_TABLES、DBA_TABLESの違いは?
USER_TABLES:自身が作成したテーブルのみ表示。ALL_TABLES:自身のテーブルに加え、他ユーザーからアクセス権限を付与されたテーブルを表示。DBA_TABLES:データベース全体の全テーブルを表示、参照には管理権限が必要。
Q4:Oracleで容量順にテーブルを表示する方法は?
DBA_SEGMENTSを参照し、segment_type = ‘TABLE’でフィルタリングし、セグメントごとのバイト数を集計します。実行にはDBA権限が必要です。詳細な構文は上記高度クエリの項目を参照してください。
Oracleでテーブル一覧を取得するには、自身の権限に適したデータディクショナリビューを選択することが鍵となります。自身のスキーマのみ確認する場合はUSER_TABLES、複数スキーマの権限あるテーブルを参照する場合はALL_TABLES、適切な管理権限がありDB全体のテーブルを確認したい場合はDBA_TABLESを使用します。
本ガイドの高度クエリを活用すれば、列名検索、統計情報確認、容量フィルタ、テーブル名部分一致といった詳細な抽出が可能です。大半の参照トラブルは権限不足または大文字小文字の不一致に起因するため、原因を把握すれば簡単に解消できます。
テーブル構造の参照を超え、複数システム間のデータ同期を実現する必要がある場合はInfo2softのi2Streamをご検討ください。トランザクション単位のリアルタイムOracleレプリケーションに対応し、スキーマ変更に手動対応が不要、本番サーバーに負荷をかけずマルチデータベース環境に対応します。