SAKURUG TECHBLOG

データディクショナリビューに触れてみる

timestampauthor-name
Kenji

はじめに

 普段プログラミングを主としている側からすると、DML( SELECT, INSERT, UPDATE, DELETE )、DML( CREATE, ALTER, DROP )はコードの中で書くことはあるので気にすることはないと思いますが、テーブルを作成したりして、「テーブル定義の設定はどうだったかな?」「あの索引は、どういう定義で作成されたんだろう?」となることが、たまに発生したりします。

 実際、私なんかの場合ですと、あまり見たことないテーブルのネーミングを見かけたりすると、今回のテーマでもあるデータディクショナリビューを参照して、類似のネーミングが存在したりするのかを確認することがあります。

 本稿では、データディクショナリビューの概要を踏みつつ、実際に操作しながら、どういったものなのかを紹介した記事となります。

どんな人向けか

  • Oracle サーバーが保持しているデータベースの構造情報や権限情報などを参照したい

前提条件

 本稿では、Oracle Live SQL 23ai の利用を前提としています。

データディクショナリビュー

 Oracle Database におけるデータディクショナリビューとは、データベースに関するさまざまなメタデータ(構造情報、ユーザー情報、権限情報など)を格納しているデータディクショナリ表から、ユーザーが扱いやすい形式で情報を参照できるように提供されているビューのことです。

 データディクショナリ表には、データベースの内部的な情報が格納されており、通常ユーザーが直接アクセスすることはありません。そこで、Oracle Databaseは、これらの情報をユーザーが理解しやすいようにデコードし、必要な情報だけを抽出・結合してビューとして公開しています。

データディクショナリビューの主な特徴

  • 読取り専用: データディクショナリビューは、データベースの情報を参照するためのものであり、直接更新することはできません。
  • 自動更新: データディクショナリ表に格納されている情報は、データベースの構成やオブジェクトの変更(テーブル作成、ユーザー作成など)に応じてOracle Databaseによって自動的に更新されます。
  • 静的データディクショナリ: ほとんどのデータディクショナリビューは「静的データディクショナリ」と呼ばれ、データベースに関する設定情報やオブジェクトの定義情報など、比較的変動の少ない情報を提供します。
  • 動的パフォーマンスビュー (V$): これとは別に、データベースのパフォーマンス情報や現在の稼働状況など、リアルタイムで変化する情報を提供する「動的パフォーマンスビュー」(通常V$で始まる)も存在します。これらは、データベースがオープンされ、使用されている間に継続的に更新されます。

データディクショナリビューの種類

データディクショナリビューには、参照できる情報の範囲によって主に以下の3種類のプレフィックス(接頭辞)があります。

  1. DBA_:
    • 対象: データベース全体の情報を表示します。
    • 利用ユーザー: 主にデータベース管理者(DBA)が使用します。
    • 権限: SELECT ANY DICTIONARY権限(またはDBAロールに付与されている)が必要です。
    • : DBA_TABLES(データベース内のすべてのテーブル情報)、DBA_USERS(すべてのユーザー情報)など。
  2. ALL_:
    • 対象: 現在のユーザーがアクセスできるすべての情報を表示します。これには、ユーザー自身が所有するオブジェクトの情報と、他のスキーマのオブジェクトで、そのユーザーがアクセス権限を持つものが含まれます。
    • 利用ユーザー: 一般ユーザーも利用できます。
    • 権限: 特定の権限は不要ですが、参照したいオブジェクトに対する権限が必要です。
    • : ALL_TABLES(アクセス可能なすべてのテーブル情報)、ALL_TAB_PRIVS(アクセス可能なオブジェクトの権限情報)など。
  3. USER_:
    • 対象: 現在のユーザーが所有するスキーマ内の情報のみを表示します。
    • 利用ユーザー: 一般ユーザーが最も頻繁に利用します。
    • 権限: 特定の権限は不要です。
    • : USER_TABLES(自身のスキーマ内のテーブル情報)、USER_OBJECTS(自身のスキーマ内のオブジェクト情報)など。

これらのビューは、ほとんどの場合、列構成が共通しており、プレフィックスによって参照範囲が異なるという特性を持っています。

データディクショナリビューの確認方法

 データディクショナリビューは、通常のテーブルと同様にSQLのSELECT文を使って参照します。

 例えば、自身のスキーマ内のテーブル一覧を確認したい場合は、次のようにクエリを実行します。

SELECT TABLE_NAME, STATUS, LAST_ANALYZED
  FROM USER_TABLES

データベース管理者(DBA)であれば、データベース全体のテーブル一覧を確認するためにDBA_TABLESを使用します。

SELECT OWNER, TABLE_NAME, STATUS
  FROM DBA_TABLES

利用可能なデータディクショナリビューの一覧を確認するには、DICTIONARYビューを参照します。

SELECT *
  FROM DICTIONARY

 データディクショナリビューは、Oracle Databaseの運用、管理、開発において非常に重要な役割を果たします。データベースの構成、オブジェクト、権限、パフォーマンスなどを理解するために不可欠な情報源となります。

実行例

 上述では、実行結果までは確認しませんでしたが、ここでは例を挙げて、実際の結果の確認までを示します。

 実施する内容としては、Oracle Live SQL を利用して、作成したテーブルが実際にUSER_TABLESで確認できるかを実施しています。

 まずは、現状のテーブルを確認するクエリを実行します。

SELECT *
  FROM USER_TABLES

実行結果

 結果を確認すると、「No items to display」と表示されており、テーブルが何も存在しないことが確認出来ます。

 では、適当にMEMBERSテーブルを作成してみます。

CREATE TABLE MEMBERS (
  ID      CHAR(4)        NOT NULL,
  NAME    VARCHAR2(30)   ,
  ADDRESS VARCHAR2(100)  ,
  PHONE   VARCHAR2(11)   ,
  EMAIL   VARCHAR2(100)
)

実行結果

 問題なく、MEMBERSテーブルが作成されました。ついでに、索引も作成します。

ALTER TABLE MEMBERS ADD
CONSTRAINT PK_MEMBERS PRIMARY KEY (
ID
) USING INDEX

実行結果

 索引も問題なく、作成出来ました。

 先ほど作成したテーブルが、データディクショナリに反映されているのかを確認します。

SELECT *
  FROM USER_TABLES

実行結果

 先ほど確認が出来なかった情報が、更新されていることが確認出来ました。

 USER_TAB_COLUMNSを参照すると、テーブル内の定義情報も確認することが出来ます。

SELECT *
  FROM USER_TAB_COLUMNS

実行結果

 きちんと定義した内容が表示されていることが確認出来ます。

 それでは、索引の情報も確認します。

SELECT *
  FROM USER_INDEXES

実行結果

 索引もデータディクショナリに更新されていることが確認出来ました。

 以上、実際のデータディクショナリに更新された情報を、データディクショナリビューで確認する方法を紹介しました。

さいごに

 最後まで、お読みいただきありがとうございます。

 今回紹介したデータディクショナリビューは、いわゆる静的データディクショナリと呼ばれるものだけでした。現場では、どちらかというと動的パフォーマンスビュー (V$)を確認することが多かったりするのですが、データベースで障害が発生した場合は、かなりの確率でこのデータディクショナリビューにお世話になります。

 何かの際に役に立てれば幸いです。

▼高校生向けインターン実施中!

弊社では高校生向けにインターンを行っております!
現役エンジニア指導の下、一緒に働いてみませんか?

高校生インターン応募フォーム

▼カジュアル面談実施中!

カジュアル面談では、会社の雰囲気や仕事内容についてざっくばらんにお話ししています。
履歴書は不要、服装自由、原則オンラインです。興味を持っていただけた方は、
ぜひ以下からお申し込みください。

皆さんにお会いできることをサクラグメンバー一同、心より楽しみにしております!

カジュアル面談応募フォーム

記事をシェアする

ABOUT ME

author-image
Kenji
2017年に中途入社。趣味は映画鑑賞・漫画(読む方)・ゲーム等々。「そろそろ運動して痩せなきゃ!」が口癖!?