Firebirdでデータベースを作成するいくつかの手順

業務の本番運用でFirebirdを使っている場面に出くわしたことは残念ながら一度もないが、ローカルや小規模のLAN内で使う分には申し分のない使い勝手の良さがある。というわけでUbuntuWindows両方の環境でときどき使っている。日本語情報が多くなく、導入事例の紹介もあまり見たことがないので、ベストプラクティスな使い方を参照しにくい難点があるが……。
大して悩んではいないけど、データベースを作成するにしてもいくつかのやりかたがあるんだよね。

Windows環境でフルパス指定でデータベースを作る

Cドライブ直下に「Firebird_files」という名前のフォルダを作って、そのなかにデータベースを作成する。

C:\Firebird_files>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'c:\Firebird_files\kosuke.fdb'
CON> user 'kosuke' password 'kosuke' default character set utf8;
SQL>
SQL> quit;

C:\Firebird_files>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C46D-D108 です

 C:\Firebird_files のディレクトリ

2012/03/04  09:38    <DIR>          .
2012/03/04  09:38    <DIR>          ..
2012/03/04  09:41           802,816 KOSUKE.FDB
               1 個のファイル             802,816 バイト
               2 個のディレクトリ  72,381,902,848 バイトの空き領域

C:\Firebird_files>

ちなみに環境はWindows XP。アクセス権限の観念が希薄なので特に問題にならないが、Linux環境等だと少し違ってくる。

Ubuntuでも同じようにフルパス指定でデータベースを作成する

Ubuntu等のLinux環境でWindowsと同じようにデータベースを作成することはできない。

kosuke@kosuke-Lenovo-G565:~$ mkdir firebird_files
kosuke@kosuke-Lenovo-G565:~$ isql-fb
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database '~/firebird_files/kosuke.fdb'
CON> user 'kosuke' password 'kosuke' default character set utf8;
Statement failed, SQLSTATE = 08001
I/O error during "open O_CREAT" operation for file "/home/kosuke/firebird_files/kosuke.fdb"
-Error while trying to create file
-Permission denied
SQL> 

理由はfirebirdをインストールしたときに追加されるユーザ「firebird」が、指定したディレクトリへの権限を持っていないため。ディレクトリをfirebirdユーザもアクセスできるように権限を変更してやれば回避できる。

kosuke@kosuke-Lenovo-G565:~$ chmod o+rwx firebird_files/
kosuke@kosuke-Lenovo-G565:~$ isql-fb
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database '~/firebird_files/kosuke.fdb'
CON> user 'kosuke' password 'kosuke' default character set utf8;
SQL> quit;
kosuke@kosuke-Lenovo-G565:~$ ls -l firebird_files/
合計 652
-rw-rw---- 1 firebird firebird 667648 2012-03-04 09:51 kosuke.fdb
kosuke@kosuke-Lenovo-G565:~$ 

ただ、こうしてしまうとホームディレクトリ配下に違うユーザが所有するファイルが作られることになる。それって少しおかしくないか?

Ubuntufirebirdユーザ所有のディレクトリにデータベースを作成する

Firebirdをインストールした際に作られるfirebirdユーザのホームディレクトリに「data」というディレクトリがあるので、そこを利用する方がスマートではないだろうか。デフォルトでfirebirdユーザ以外へのアクセスは参照含めて許可されていないので、セキュリティ的な観点からもより正しいように思える。

kosuke@kosuke-Lenovo-G565:~$ cd /var/lib/firebird/2.5/
bash: cd: /var/lib/firebird/2.5/: 許可がありません

kosuke@kosuke-Lenovo-G565:~$ isql-fb
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database '/var/lib/firebird/2.5/data/kosuke.fdb'
CON> user 'kosuke' password 'kosuke' default character set utf8;
SQL> 

エイリアスを作ってからデータベースを作成する

Firebirdではデータベースにエイリアスを割り振ることができる。「aliases.conf」という設定ファイルに追加することで、フルパス指定しなくてもDB接続できるようになる。aliases.confはWindowsであれば「C:\Program Files\Firebird\Firebird_2.5」、Ubuntuであれば「/etc/firebird/2.5」に置いてあるはず。
aliases.confのなかに書き方のサンプルがあるので、特に迷うことはないと思う。

# ------------------------------
#
# Examples:
#
#   dummy = c:\data\dummy.fdb
#

kosuke = c:\Firebird_files\kosuke.fdb

エイリアスを設定しておけば次のように接続できるようになる。

C:\>isql kosuke -u kosuke -p kosuke
Database:  kosuke, User: kosuke
SQL>

エイリアスを使ってデータベース作成することもできる。

C:\>isql kosuke -u kosuke -p kosuke
Database:  kosuke, User: kosuke
SQL> drop database;
SQL> quit;

C:\>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'kosuke'
CON> user 'kosuke' password 'kosuke';
SQL>

スマートさからいえばエイリアスを使うべきかなと思う。

あと最後に。「firebird.conf」という設定ファイルにある「DatabaseAccess」というパラメータを設定するとデータベースファイルを格納できるディレクトリを制限することが可能で、ここに「None」という値を指定するとエイリアスでのアクセスしかできないようになる。
セキュリティ・使い勝手の観点からは、

  1. エイリアスを指定する (aliases.conf)
  2. 「DatabaseAccess = None」で、エイリアスによるアクセス以外許可させないようにする (firebird.conf)
  3. エイリアス指定でデータベースを作成する (create database alias_name)
  4. Linux環境ならfirebirdユーザが所有するディレクトリにデータベースファイルを置く

これらをセットで運用するのがいいのかなと思っている。