キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< Firebird パフォーマンスカウンタ詳細と3.0 Beta1までに追加されているシステムテーブル | main | Firebirdでの数値の扱い方を知る >>
Firebird システムテーブル利用のコツ
0
    本エントリはFirebird Advent Calendar 2014の21日目です。nakagamiさんによる(20日目はこちら)でラストに向けてまだまだ参加者募集中

    参照しているのはIvanさんの以下のプレゼンテーション資料です。

    Tips for using system tables (Ivan Prenosil)

    2013/2014年はほとんど動きが見えなかったFirebirdプロジェクトですが、本年後半から徐々にまた動き始めました。これからしばらく先月チェコでおこなわれたFirebird Conference 2014をネタに記事を書いていきたいと思います。

    Firebird/InterBaseではメタデータ関連の操作に使える対話型ユティリティ(isql)のコマンドが少なく(show コマンドで一応の取得は可能)、また情報スキーマ(Information Schema)もないので、メタデータ関連の情報取得手順が大変複雑です。

    通常はシステムテーブル(RDB$)を直接アクセス(!) するしかありません。まさに以下のThe Firebird FAQにあるようになにか管理ツールを用いたほうがいいでしょう。

    How to get schema information, list of metadata objects and their properties?(The Firebird FAQ)

    The data stored in RDB$ tables is not very end-user friendly, so you are better off with some administration tool to get the details.

    しかし、アプリケーションから利用したいような場合は、そのようなことはいってられませんので、RDB$を直接アクセスする必要がでてきます。

    [簡単な例]
    ユーザテーブルEMP, OBJECTSがあるデータベースについて、テーブル一覧とEMPの定義をみるとき。
    isqlのコマンドでは以下のように求めます。

    SQL> show tables;
    EMP OBJECTS

    SQL> show table emp;
    SAL INTEGER Nullable

    RDB$で同様のことをしようとすると以下のように求めます。(元ネタはThe Firebird FAQ)

    select rdb$relation_name
    from rdb$relations
    where rdb$view_blr is null
    and (rdb$system_flag is null or rdb$system_flag = 0);

    select f.rdb$relation_name, f.rdb$field_name
    from rdb$relation_fields f
    join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
    and r.rdb$view_blr is null
    and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
    and r.rdb$relation_name='EMP'
    order by 1, f.rdb$field_position;

    最初の一歩はこのようにrdb$relationsテーブルをみるところでしょう。ここにはテーブルやビュー、一時テーブルや外部テーブルなどが全て格納されています。
    rdb$system_flagが1の場合にはシステムが利用しているものなので、それ以外(rdb$system_flag is null or rdb$system_flag = 0)で、
    またビューを省くために簡易的にrdb$view_blr is nullで条件を絞っています。ただ種別を明確に指定する場合にはrdb$relation_typeで指定したほうがいいでしょう。
    実表は0, ビューは1です。

    select rdb$relation_name
    from rdb$relations
    where rdb$relation_type = 0
    and (rdb$system_flag is null or rdb$system_flag = 0);

    テーブル一覧はここまでです。

    なお先ほどのテーブル定義取得はカラム名しかもってきてないので、データ型やNULLかどうか、などを取得するにはもっと複雑なクエリが必要です。

    select r.rdb$field_name,
    t.rdb$type_name,
    f.rdb$field_length,
    r.rdb$null_flag,
    f.rdb$validation_source

    from rdb$relation_fields r, rdb$types t, rdb$fields f

    where r.rdb$relation_name='EMP' and
    f.rdb$field_name=r.rdb$field_source and
    t.rdb$field_name='RDB$FIELD_TYPE' and
    f.rdb$field_type=t.rdb$type;

    詳しくは次のドキュメントをご参照ください。

    Retrieving Information about InterBase System Objects

    Extracting META information from Interbase/Firebird SQL (INFORMATION_SCHEMA)




    [実際の例]
    Ivanさんの例では主キーがないテーブルを以下のクエリで求めています。

    SELECT RDB$RELATION_NAME AS "Table"
    FROM RDB$RELATIONS
    WHERE RDB$RELATION_TYPE IN (0, 4, 5)
    AND (RDB$SYSTEM_FLAG = 0 OR RDB$SYSTEM_FLAG IS NULL)
    AND RDB$RELATION_NAME NOT IN
    (SELECT RDB$RELATION_NAME FROM RDB$RELATION_CONSTRAINTS
    WHERE RDB$CONSTRAINT_TYPE = 'PRIMARY KEY')
    ORDER BY RDB$RELATION_NAME;

    これは[簡単な例]でやったシステムテーブルではない、実表(0)とグローバル一時表(4,5)の一覧を取得し、そこから
    制約(RDB$RELATION_CONSTRAINTS)に主キー(RDB$CONSTRAINT_TYPE = 'PRIMARY KEY)がない、というものをリストししています。

    Ivanさんのプレゼンではここからどんどん深みにはまっていくのですが(笑)まぁ必要な人と深みはまりたいひとは是非順に読んでいって下さい。

    JUGEMテーマ:コンピュータ

    | meijik | Firebird/InterBase | 06:46 | comments(0) | trackbacks(0) | - | - |









    トラックバック機能は終了しました。
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
    << March 2020 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • たまたま「プリントヘッドの種類が違います」エラーから復活@MG6230
      meijik (11/20)
    • [ミュージシャンに聴かせたい・弾かせたい!] (4) 山田元気様
      meijik (07/27)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (03/03)
    • 2019年の木村明治
      田中尚 (01/08)
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE