Firebirdのシステムデータにアクセスしたい場合
DBを扱うプログラムを書く際に、テーブルやカラム、インデックスやトリガー等の一覧を取得したい場合がありませんか?
何かと検索しているので、Firebirdの場合をメモしておきます。
目次
環境
Firebird Embedded 2.5.4
FirebirdSql.Data.FirebirdClient 4.10.0.0
C#
.NET Provider使う場合
FirebirdSql.Data.FirebirdClient使える場合は、非常に簡単です。
GetSchemaしましょう。
テーブル一覧が必要であれば、
using (var con = new FbConnection(接続文字列)) using (var command = con.CreateCommand()) { con.Open(); con.GetSchema("Tables"); }
とすれば、
みたいに取れます。
引数を追加してあげれば、
con.GetSchema("Tables", new[] { null, null, null, "TABLE" });
ユーザーテーブル一覧を取得できます。
制限しない場合は、System Tables(RDB$xxx)とかMonitoring Tables(MON$xxx)とかViewとかもれなくついてきます。
各スキーマの引数一覧
そんな便利なものは見つけてません。(ノ゚ω゚)ノ*
あきらめてソースコードから引っ張りましょう。
大抵のケースで、
* restrictions [0] : TABLE_CATALOG
* restrictions [1] : TABLE_SCHEMA
* restrictions [2] : TABLE_NAME
* それ以降、個別
となっているっぽいです。
(※上記、new[] { null, null, null, "TABLE" }の部分。)
SQLを自力で書く場合
Referenceとにらめっこしましょう。
.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も似たような感じなんだろうか。。