ぽにょろん

思いついたこととメモ

Firebirdのシステムデータにアクセスしたい場合

DBを扱うプログラムを書く際に、テーブルやカラム、インデックスやトリガー等の一覧を取得したい場合がありませんか?
何かと検索しているので、Firebirdの場合をメモしておきます。

目次

環境

Firebird Embedded 2.5.4
FirebirdSql.Data.FirebirdClient 4.10.0.0
C#

.NET Provider使う場合

FirebirdSql.Data.FirebirdClient使える場合は、非常に簡単です。
GetSchemaしましょう。

f:id:kowill:20160307181701p:plain:w500

テーブル一覧が必要であれば、

using (var con = new FbConnection(接続文字列))
using (var command = con.CreateCommand())
{
    con.Open();
    con.GetSchema("Tables");
}

とすれば、
f:id:kowill:20160307181820p:plain:w500
みたいに取れます。

引数を追加してあげれば、

con.GetSchema("Tables", new[] { null, null, null, "TABLE" });

f:id:kowill:20160307182401p:plain:w500
ユーザーテーブル一覧を取得できます。
制限しない場合は、System Tables(RDB$xxx)とかMonitoring Tables(MON$xxx)とかViewとかもれなくついてきます。

スキーマの引数一覧

そんな便利なものは見つけてません。(ノ゚ω゚)ノ*
あきらめてソースコードから引っ張りましょう。

FirebirdSql.Data.FirebirdClient/Provider/src/FirebirdSql.Data.FirebirdClient/Schema at master · cincuranet/FirebirdSql.Data.FirebirdClient · GitHub

大抵のケースで、
* restrictions [0] : TABLE_CATALOG
* restrictions [1] : TABLE_SCHEMA
* restrictions [2] : TABLE_NAME
* それ以降、個別
となっているっぽいです。
(※上記、new[] { null, null, null, "TABLE" }の部分。)

SQLを自力で書く場合

Referenceとにらめっこしましょう。

Appendix D: System Tables

.NET Providerのソースコードから、必要なSQLの参考にするのもありかなと思います。

テーブル一覧

select rdb$relation_name AS Name  
 from rdb$relations  
 where rdb$relation_type = 0 and rdb$system_flag = 0  
 order by rdb$relation_name asc

列の一覧取る際に、型名,PK,FK等の付属情報つけようとすると、SQLが複雑になって、めんどかったです。
ほかのRDBも似たような感じなんだろうか。。