【Oracle】テーブル・列のコメント(論理名)を取得・設定する方法|USER/ALL/DBA_TAB_COMMENTS・COMMENT ON・一括確認・未設定検出まで完全解説

【Oracle】テーブル・列のコメント(論理名)を取得する方法|USER/ALL/DBA_TAB_COMMENTS・設定・一括確認まで完全解説 Oracle

Oracle ではテーブルや列にコメント(論理名)を設定でき、データディクショナリビューから取得できます。テーブル定義書の自動生成、設計書との整合性チェック、コメント未設定箇所の検出など、開発・保守の現場で欠かせない機能です。

この記事でわかること
・USER / ALL / DBA_TAB_COMMENTS の違いと使い分け
・USER / ALL / DBA_COL_COMMENTS で列コメントを取得する方法
・COMMENT ON TABLE / COLUMN でコメントを設定・削除する方法
・テーブルコメント + 列コメントを一括取得するクエリ
・コメント未設定のテーブル・列を検出するクエリ
・DBMS_METADATA でコメント DDL を一括出力する方法
・PL/SQL で複数テーブルにコメントを一括設定する方法
・テーブル定義書向けの出力クエリ
スポンサーリンク

コメント取得ビューの種類と違い

テーブルコメント用ビュー

ビュー名 参照できる範囲 必要権限 OWNER 列
USER_TAB_COMMENTS 自スキーマのテーブル・ビュー なし なし
ALL_TAB_COMMENTS アクセス権のある全テーブル・ビュー なし あり
DBA_TAB_COMMENTS DB 内の全テーブル・ビュー DBA 権限 あり

列コメント用ビュー

ビュー名 参照できる範囲 必要権限 OWNER 列
USER_COL_COMMENTS 自スキーマのテーブル・ビューの列 なし なし
ALL_COL_COMMENTS アクセス権のある全テーブル・ビューの列 なし あり
DBA_COL_COMMENTS DB 内の全テーブル・ビューの列 DBA 権限 あり
自分のスキーマだけ確認するなら USER_ 系(OWNER 列がなくシンプル)、他スキーマも含める場合は ALL_ 系、DBA 権限で DB 全体を対象にするなら DBA_ 系を使い分けます。

テーブルコメントを取得する

自スキーマのテーブルコメントを一覧表示

SQL
SELECT table_name,
       table_type,
       comments
  FROM user_tab_comments
 WHERE table_type = 'TABLE'
 ORDER BY table_name;

特定スキーマ・テーブルのコメントを取得

SQL
-- 特定スキーマのテーブルコメントを一覧表示
SELECT table_name, table_type, comments
  FROM all_tab_comments
 WHERE owner = 'HR'
   AND table_type = 'TABLE'
 ORDER BY table_name;

-- 特定テーブル1件のコメントを取得
SELECT table_name, comments
  FROM all_tab_comments
 WHERE owner      = 'HR'
   AND table_name = 'EMPLOYEES';

コメントをキーワードで検索する

SQL
-- コメントに「マスタ」を含むテーブルを検索
SELECT table_name, comments
  FROM user_tab_comments
 WHERE comments LIKE '%マスタ%'
 ORDER BY table_name;

列コメントを取得する

特定テーブルの全列コメントを取得

SQL
SELECT column_name, comments
  FROM all_col_comments
 WHERE owner      = 'HR'
   AND table_name = 'EMPLOYEES'
 ORDER BY column_name;

列の順序(COLUMN_ID)付きで取得する

列コメントビューには列の並び順がないため、ALL_TAB_COLUMNS と結合して COLUMN_ID 順に表示します。

SQL
SELECT ac.column_id,
       ac.column_name,
       cc.comments
  FROM all_tab_columns  ac
  JOIN all_col_comments cc
    ON  cc.owner       = ac.owner
   AND  cc.table_name  = ac.table_name
   AND  cc.column_name = ac.column_name
 WHERE ac.owner      = 'HR'
   AND ac.table_name = 'EMPLOYEES'
 ORDER BY ac.column_id;

テーブルコメントと列コメントを一括取得する

テーブルの論理名と各列の論理名を 1 クエリで一覧表示するクエリです。テーブル定義の確認に便利です。

SQL
SELECT
  tc.table_name,
  tc.comments         AS table_comment,
  ac.column_id,
  ac.column_name,
  cc.comments         AS column_comment
  FROM all_tab_comments  tc
  JOIN all_col_comments  cc
    ON  cc.owner      = tc.owner
   AND  cc.table_name = tc.table_name
  JOIN all_tab_columns  ac
    ON  ac.owner      = cc.owner
   AND  ac.table_name = cc.table_name
   AND  ac.column_name= cc.column_name
 WHERE tc.owner      = 'HR'
   AND tc.table_name = 'EMPLOYEES'
 ORDER BY ac.column_id;
複数テーブルを一度に確認したい場合は WHERE tc.table_name IN ('EMPLOYEES', 'DEPARTMENTS') のように IN 句で指定します。

コメントを設定する(COMMENT ON)

テーブルにコメントを設定する

SQL
COMMENT ON TABLE employees IS '社員マスタ';

列にコメントを設定する

SQL
COMMENT ON COLUMN employees.employee_id IS '社員ID';
COMMENT ON COLUMN employees.first_name  IS '名';
COMMENT ON COLUMN employees.last_name   IS '姓';
COMMENT ON COLUMN employees.hire_date   IS '入社日';
COMMENT ON COLUMN employees.salary      IS '月額給与(円)';

コメントを削除する

SQL
-- 空文字列を設定するとコメントが削除される(NULL に戻る)
COMMENT ON TABLE  employees          IS '';
COMMENT ON COLUMN employees.salary   IS '';
COMMENT ON は DDL 文のため、実行時に自動コミットされます。明示的な COMMIT は不要です。

他スキーマのテーブルにコメントを設定する

SQL
-- スキーマ名.テーブル名 で指定
COMMENT ON TABLE  hr.employees          IS '社員マスタ';
COMMENT ON COLUMN hr.employees.salary   IS '月額給与(円)';
他スキーマへのコメント設定には COMMENT ANY TABLE システム権限が必要です。権限がない場合は ORA-01031: insufficient privileges エラーが発生します。

ビュー・マテリアライズドビューへのコメント

COMMENT ON TABLE はビューやマテリアライズドビューにも使用できます。構文はテーブルと同じです。

SQL
-- ビューにコメントを設定
COMMENT ON TABLE v_active_employees IS '在籍社員ビュー';

-- ビューの列にコメントを設定
COMMENT ON COLUMN v_active_employees.full_name IS '氏名(姓+名)';

-- マテリアライズドビューにコメントを設定
COMMENT ON TABLE mv_sales_summary IS '売上集計マテビュー(日次更新)';
USER_TAB_COMMENTSTABLE_TYPE 列で 'TABLE' / 'VIEW' / 'MATERIALIZED VIEW' を判別できます。

コメントが設定されていないテーブル・列を特定する

設計書との整合性確認やコメント漏れの検出に役立つクエリです。

コメント未設定のテーブルを一覧取得

SQL
SELECT table_name, table_type
  FROM user_tab_comments
 WHERE (comments IS NULL OR comments = '')
   AND table_type = 'TABLE'
 ORDER BY table_name;

コメント未設定の列を一覧取得

SQL
-- 特定テーブルでコメント未設定の列を抽出
SELECT column_name
  FROM user_col_comments
 WHERE table_name = 'EMPLOYEES'
   AND (comments IS NULL OR comments = '')
 ORDER BY column_name;

スキーマ全体でコメント未設定の列を集計する

SQL
-- テーブルごとにコメント未設定列の件数を集計
SELECT cc.table_name,
       COUNT(*) AS no_comment_cols,
       (SELECT COUNT(*) FROM user_tab_columns tc
         WHERE tc.table_name = cc.table_name) AS total_cols
  FROM user_col_comments cc
 WHERE (cc.comments IS NULL OR cc.comments = '')
 GROUP BY cc.table_name
 ORDER BY no_comment_cols DESC;
定期的にこのクエリを実行してコメント設定率を把握しておくと、ドキュメントの品質管理に役立ちます。

DBMS_METADATA でコメント DDL を出力する

DBMS_METADATA.GET_DEPENDENT_DDL を使うと、テーブルに紐づく全コメントを COMMENT ON 文の形式で一括出力できます。環境の移行やバックアップに便利です。

SQL
SELECT DBMS_METADATA.GET_DEPENDENT_DDL(
         'COMMENT',
         'EMPLOYEES',
         'HR'
       ) AS comment_ddl
  FROM dual;
コメントが 1 件も設定されていないテーブルに対して実行すると ORA-31608: specified object of type COMMENT not found エラーが発生します。事前にコメントの有無を確認してから実行してください。

PL/SQL でコメントを一括設定する

大量のテーブル・列にコメントを設定する場合、PL/SQL の動的 SQL が効率的です。

コメント未設定の列に「未設定」マークを付ける

PL/SQL
BEGIN
  FOR rec IN (
    SELECT table_name, column_name
      FROM user_col_comments
     WHERE comments IS NULL
  ) LOOP
    EXECUTE IMMEDIATE
      'COMMENT ON COLUMN ' || rec.table_name
      || '.' || rec.column_name
      || ' IS ''【要設定】''';
  END LOOP;
END;
/

動的 SQL でコメントを一括設定するパターン

PL/SQL
-- テーブルコメントの設定例
BEGIN
  EXECUTE IMMEDIATE
    q'[COMMENT ON TABLE employees IS '社員マスタ']';
  EXECUTE IMMEDIATE
    q'[COMMENT ON COLUMN employees.employee_id IS '社員ID']';
  EXECUTE IMMEDIATE
    q'[COMMENT ON COLUMN employees.first_name IS '名']';
  EXECUTE IMMEDIATE
    q'[COMMENT ON COLUMN employees.last_name IS '姓']';
  EXECUTE IMMEDIATE
    q'[COMMENT ON COLUMN employees.hire_date IS '入社日']';
  DBMS_OUTPUT.PUT_LINE('コメント設定完了');
END;
/
Oracle の代替クォート構文 q'[...]' を使うと、文字列内のシングルクォートをエスケープせずに記述できます。EXECUTE IMMEDIATE で COMMENT ON 文を実行する際に便利です。

テーブル定義書向けの出力クエリ

Excel 等にエクスポートしてテーブル定義書を自動生成する際に使えるクエリです。列の物理名・論理名・型・NULL 可否・デフォルト値を一括出力します。

SQL
SELECT
  ac.column_id         AS "No.",
  ac.column_name       AS "物理名",
  cc.comments          AS "論理名",
  ac.data_type
    || CASE
         WHEN ac.data_precision IS NOT NULL
         THEN '(' || ac.data_precision || ',' || ac.data_scale || ')'
         WHEN ac.char_length > 0
         THEN '(' || ac.char_length || ')'
         ELSE ''
       END             AS "型・桁",
  ac.nullable          AS "NULL可否",
  ac.data_default      AS "デフォルト値"
  FROM all_tab_columns  ac
  JOIN all_col_comments cc
    ON  cc.owner       = ac.owner
   AND  cc.table_name  = ac.table_name
   AND  cc.column_name = ac.column_name
 WHERE ac.owner      = 'HR'
   AND ac.table_name = 'EMPLOYEES'
 ORDER BY ac.column_id;
SQL*Plus や SQL Developer で実行して CSV エクスポートすれば、そのままテーブル定義書のベースとして活用できます。

関連記事

よくある質問

QUSER_TAB_COMMENTS と ALL_TAB_COMMENTS はどう使い分けますか?
A自分のスキーマ内だけ確認するなら USER_TAB_COMMENTS(OWNER 列がなくシンプル)。他スキーマのテーブルも含めて検索するなら ALL_TAB_COMMENTS(OWNER 列あり)。DBA 権限で DB 全体を対象にするなら DBA_TAB_COMMENTS を使います。
Qコメントを削除するにはどうすればよいですか?
ACOMMENT ON TABLE テーブル名 IS '' のように空文字列を設定すると、コメントが NULL に戻ります。DELETE 文では削除できません。
Q他スキーマのテーブルにコメントを設定するには?
ACOMMENT ON TABLE スキーマ名.テーブル名 IS 'コメント' の形式で指定します。COMMENT ANY TABLE システム権限が必要です。DBA 権限があれば自動的に対象になります。
QCOMMENT ON は COMMIT が必要ですか?
Aいいえ。COMMENT ON は DDL 文のため、実行時に自動コミットされます。未コミットの DML(INSERT/UPDATE 等)がある場合は、COMMENT ON の実行時に一緒にコミットされる点に注意してください。
QDBMS_METADATA でコメント DDL を出力したら ORA-31608 が出ました。
Aコメントが 1 件も設定されていないテーブルに対して GET_DEPENDENT_DDL('COMMENT', ...) を実行すると ORA-31608 エラーが発生します。事前に USER_TAB_COMMENTSUSER_COL_COMMENTS でコメントの有無を確認してから実行してください。

まとめ

目的 使用するビュー / コマンド
テーブルコメントの取得 USER / ALL / DBA_TAB_COMMENTS
列コメントの取得 USER / ALL / DBA_COL_COMMENTS
テーブル + 列コメントの一括取得 TAB_COMMENTS JOIN COL_COMMENTS JOIN TAB_COLUMNS
コメントの設定 COMMENT ON TABLE / COMMENT ON COLUMN
コメントの削除 COMMENT ON ... IS ''(空文字設定)
コメント未設定箇所の検出 WHERE comments IS NULL OR comments = ''
コメント DDL の一括出力 DBMS_METADATA.GET_DEPENDENT_DDL
コメントの一括設定 PL/SQL の EXECUTE IMMEDIATE

テーブル・列のコメントはデータベースの可読性を大幅に向上させます。開発初期からコメントを設定し、定期的にコメント未設定の検出クエリで漏れをチェックすることで、高品質なデータベース設計を維持できます。