ウィキのコピーミラー

これは pascal.chat のウィキのミラーです。編集、履歴、ログインはそちらで行います。

Firebird/ja

English · Français · Русский · 日本語


データベースのポータル
参照: · Databases 概要 · ライブラリ · フィールドの型 · コントロール · FAQ · SqlDBHowto/ja · TSQLQuery の利用 · メモリ上で動作するデータベースの作り方 · チュートリアル/練習となる記事: · 概要 · 0 - データベースのセットアップ · 1 - 開始 · 2 - 編集 · 3 - クエリ · 4 - データモジュール · SQLdb Programming Reference/ja · 各種データベース · Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

これはLazarus/FPCでSQLDB(FPC/Lazarus同梱のライブラリ)SQLDBを用いてFirebird データベースを用いるためのガイドである。他のアクセス方法はOther Firebird librariesに述べられている。

概要

Firebirdは長年にわたり使用、開発されてきたオープンソースのフリーデータベースサーバである(BorlandによってオープンソースとなったInterbase 6 より開発されている)。豊富なSQLステートメント(例えば INSERT...RETURNING)、ストアドプロシージャ、トリガ、などをサポートしている。もしすでにあるFirebirdの拡張関数を拡張したければ、Free PascalのコンパイルされたUDF(ユーザー定義関数)を書くこともできる。 本データベースは一度設定してしまえばほとんど手動によるDBA作業を要求せず、小規模ビジネス用途、あるいは組み込み用途に好適に用いられる。PostgreSQLがそのような大規模環境にはより良い選択かもしれないが、適切なチューニングでテラバイトスケールにまで拡張できる。

Firebirdは - FPC/Lazarusで1行もコードを変える必要なく、(ファイルベースの)組み込みとクライアント/サーバデータベースを提供する もし組み込みデータベースとして用いられると、SQLiteよりも豊富なSQLサポート同様に、SQLiteが組み込みデータベースとして非常に優秀だといえど、クライアント/サーバデータベースにシームレスに移行できる 最新の安定バージョン、Firebird 2.5、はWindows(32- and 64-bit)、様々なLinuxバージョン (32- and 64-bit)、Solaris (Sparc、Intel)、HP-UX (PA-Risc)、OSXで動作する。

現在Androidにポート中で、Windows CEとWindows Mobileでは利用できない。

FPCのSQLDBにおけるFirebirdのサポートは非常によく、PostgreSQLに匹敵する。

ドキュメンテーション

FPC 2.6.2+には公式ドキュメンテーションが含まれている: SQLDB documentation for IBConnection

クライアント/サーバと組み込みインストール

Firebirdはクライアント/サーバと組み込みモードで動作することができる。

Client/Server はどこかに物理的なFirebirdサーバ: ローカルマシンあるはネットワークでアクセスできる他のマシン。 サーバに対する接続はTCP/IPを介して、名前、IPアドレスを含む接続をホスト名である。このために必要なFirebird DLLは fbclient.dll(およびそのサポートファイル) である。

Embedded Firebird(組み込みFirebird)はローカルマシンのFirebirdデータベースにアクセスするFirebird DLLをロードするアプリケーションを意味する。接続を特定すれば、ホスト名はいつもからである。このために必要なFirebird DLLは fbembed.dll(およびそのサポートファイル)である。 詳細はここを参照されたいthe wiki page on Firebird embedded。

fbembed.dll はクライアント/サーバと組み込み用途両方に用いられることに注意。であるので、このdllのみをインストールするのは賢明である。

Windows

Win64: 特定のFPC/LazarusではWin64バージョンを用いないことを確かめてほしい here

Windows: (これはすべてのSQLLBデータベースドライバに当てはまる)、fbclient.dll を(もしくはfbembed.dll)を持つ必要があり、そのサポートDLLはいかにインストールする:

全てのデータベースDLLのように、DLLのビット数をアプリケーションに揃えなければならない。32-bitのためにコンパイルしたら、32-bitライブラリを、64-bitならば、64-bitを。

Unix/Linux/macOS

FreeBSD/Linux/macOSでは、Firebirdクライアントライブラリをインストールするべきである(例えばパッケージマネージャで通常パッケージと-devパッケージ)、またはそれらはライブラリサーチパスに置かれるべきである。

FPCは通常のライブラリ名を探索する(例えばlibfbclient.so.2.5, libgds.so, and libfbembed.so.2.5; もし、バージョンが異なっていたらibase60.incを調べられたい) これには2つの方法がある:

pascal
function InitialiseIBase60(Const LibraryName : AnsiString) : integer;

を呼ぶ(このためにはibase60dynユニットを使う必要があるかもしれない).

接続例

クライアント/サーバの例:

pascal
????????????: 192.168.1.1
    * ?????????????????????IP???????????? 192.168.1.1???????????? 
    ?????????????????????: /interdata/example.fdb  
    * ????????????????????????????????????????????????/interdata?????????????????????"example.fdb"(????????????IP address 192.168.1.1).
    ???????????????: SYSDBA
    ???????????????: masterkey

もう1つのクライアント/サーバ:

pascal
????????????: dbhost
    * ?????????????????????dbhost??????????????????????????????????????????
    ?????????????????????: F:\Program Files\firebird\examples\employee.fdb  
    * dbhost???F:?????????????????Program Files\firebird\examples?????????????????????"employee.fdb"???????????????????????????????????????
    ???????????????: SYSDBA
    ???????????????: masterkey

組み込み例:

pascal
????????????: ??????
    * ??????????????????????????????
    ?????????????????????: test.fdb
    * ???????????????????????????????????????????????????????????????????????????????????????????????????"test.fdb"(fbembed.dll???????????????????????????????????????????????????????????????????????????????????????)
    ???????????????: SYSDBA
    * ???????????????????????????????????????????????????????????????...
    ???????????????: ????????????
    * ... ????????????????????????????????????????????????

トラブルシュート クライアント/サーバアクセス問題

Interbase/Firebirdサーバが示されたIP/ホスト名で実行されていることを確かめること。マシンにtelnetして接続性を試すことができる。Firebirdは普通ポート3050で待ち受けている:

pascal
telnet 192.168.1.1 3050

何か、おそらくブランクスクリーンのようなものを見るはずだ。しかし何かをタイプできる。これはFirebirdデータベースにデータを送ったこととなる。

さらなる情報についてはFirebirdドキュメンテーションを参照されたい。

イベントのモニタリング

FPC/LazarusにはFirebirdデータベースからくるイベントをモニターするコンポーネントが付属する; TFBEventMonitorを参照されたい。

プログラム的にオブジェクトを作る

例えばツール、Flamerobinといったツールでテーブルを作ることができるが、またプログラム的/動的に行うこともでき、それは現在存在する、データベーススキーマに新しいスキーマでアップデートするときに便利である。

このタスクを行うために例えば TSQLQuery.ExecSQL を実行する:

pascal
Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
    // どのDMLの前 - SELECT、INSERTなどのステートメント、DDLの後にトランザクションをコミットする必要がある。
    // さもないとSQLはオブジェクトを見ないだろう。

これを行うためにTSQLScriptオブジェクトを用いる - TSQLScriptを参照されたい。

データベース管理

FPC/Lazarusはデータベース管理のためのコンポーネントを有している; TFBAdminを参照されたい。

日常の問題と解決策

ときに、LazarusのFirebirdは扱いに注意が必要となる。以下の解決策をご覧いただきたい。

読み取り専用カラム / COMPUTED BYフィールドへのアップデート

もし、FirebirdテーブルにCOMPUTED BYフィールド(サーバ側で計算されるフィールド)を持つ場合、SQLDBはそれらは読み取り専用で(性能上の理由で)ピックアップしない。

このような場合、自動生成されたINSERTSQL、UPDATESQLが"attempted update of read-only column"のようなメッセージをだす。解決策はTSQLQueryのSQLプロパティを設定した後に、当該フィールドをがアップデートされないかもしれないと手動で特定することである。それはこのように:

pascal
// ユーザーが変更できないようにこのフィールドを変更した値でアップデートまたは検索しないようにことである。
    sqlquery1.fieldbyname('full_name').ProviderFlags:=[];

大整数: 失われた正確性

もし大整数データタイプ(64 bit でサインされた整数signed integer)をFirebirdで用いるときはパラメータとして.AsIntegerの代わりに.AsLargeIntを用いること:

pascal
// 大整数のIDをここで割りてる
    sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
    // これを使うこと:
    sqlquery1.params.parambyname('ID').aslargeint := <some qword or 64 bit integer variable>;
    // これは用いないこと:
    //sqlquery1.params.parambyname('ID').asinteger := <some qword or 64 bit integer variable>;
    ...

... さもないと重複したプライマリキー - もし大整数をプライマリキーに用いている場合、があるとエラーが出るかもしれない。

ブール値データ型

Firebirdのバージョン3.0に満たないものはブール値データ型を持たない。

少なくともFPCトランク(2.7.1)はこの型をエミュレートできる:

SMALLINTを用いるDOMAINを用いること(他の整数型も動作するだろう - 適宜テストして読み替えられたい):

pascal
CREATE DOMAIN "BOOLEAN" AS SMALLINT
     CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
     /* -1 ???FPC SQLDB????????????????????????????????????????????????; 1????????????????????????????????????????????????????????????????????????*/
    ;

フィールド/カラムにこのドメイン型を使わせること、例えば

pascal
CREATE TABLE MYTABLE
    (
    ...
      MYBOOLEANCOLUMN "BOOLEAN",
    );

To do: これがLazarusのグリッド等で動くことの確認。

INSERT INTO...RETURNING 問題 / Cursorは開いていない =

もし、このようなSQLでselect SQL(例えば Query Open)をしようとすると:

pascal
INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID

このようなエラーを見ることになる:

pascal
Database error: ??: Fetch??:
     -Dynamic SQL Error
     -SQL error code = -504
     -Invalid cursor reference
     -Cursor is not open(error code: 335544569)

FPC 2.6.0 (Lazarus 1.0で供給される)もしくはそれ未満では, おそらくFPC SQLDBパーサバグに遭遇しただろう。

SQLDBは今行われているステートメントは通常の値を返さない、INSERTステートメントと考える。実際はそれはデータを返す。 より新しいFPCコードではこれは修正してある。

もし、多くの人間がするように、プライマリキーにジェネレータ/連続数を用いているのならば、これの回避の仕方は次の連続番号を最初に得ることである:

pascal
SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* ????????????????????????????????????GEN_PEOPLEID????????? */

そして、それを一般的なINSERTをすることに用いる。 FAQ entryを参照されたい。

Locateが動いてないようだ

Source: Issue ##21988

UTF8(もしくは他のマルチバイトキャラクタセット)CHARフィールドを動作させると、locateはレコードを見失うようだ。 問題はUTF8キャラクタセットが用いられ、どのようにFirebirdがカラムの長さを返すかにほとんど関連している。UTF8の場合、Firebirdは4倍の"キャラクタ長"として最大カラム長(バイトで)を返す。そのため、char(8)で定義されたカラムを持つと、Firebirdは4*8=32を返す。 値はこの32の長さに対して右揃えされる。例えば'57200001'をロケートするとフィールドは実際には'57200001 ........................'(ここでは続くスペースをドットで表している)を格納するのでマッチしない。

回避策: selectクエリを書き直す:

pascal
SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
pascal
?????????
pascal
SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...

または VARCHAR フィールドを用いる。

注意: この問題はフィールド長を返すことに依存する他のデータベースでも起こるかもしれない。

上級トランザクション

この情報/より高度なものとして以下がある:

トランザクション隔離レベル

もし望むなら、トランザクションのパラメータプロパティに1行加えることで、トランザクション隔離レベルを変えることができる:

例:

pascal
SQLTransaction1.Params.text:='isc_tpb_read_committed';

トランザクションに効果のあるパラメータを追加できる(ibconnection.ppソースファイルから引用および1(http://conferences.embarcadero.com/article/32280))

アクセスモード

読み取り専用または読み書き可能を許す

ロック回避

テーブル予約

テーブル全体をロックする。

組み合わせ:

レコードバージョン

この設定は明らかに他のトランザクションによって変更されたレコードに対するisc_tpb_read_committedアイソレーションモードに対してのみ関連する:

様々なオプション

完全性のためにFirebird/Interbase FPCコードの中にはいくつかのオプションがある。 おそらくバッチinsert/editの速度を上げるためにisc_tpb_no_auto_undoを用いるであろう。

Firebird と ISO トランザクション

FirebirdトランザクションはISO/ANSIトランザクションレベルに1対1で当てはまっていない。要約は:

通常のコンビネーション

デフォルトは読み取りコミットである(おそらく確認の必要がある)。

バッチ / バルク INSERT

isc_tpb_read_committed と isc_tpb_no_rec_version は良い組み合わせであろう: バッチが進行しているときに他のトランザクションが可能である。

読み取り専用トランザクション

もし、データベースアクセスが読み取り専用であることを望むなら、このトランザクションパラメータを設定することでそのようにできる:

この組み合わせはガーベージコレクションをブロックしないだろう、それは良いことである。 出典: 4(http://tech.groups.yahoo.com/group/firebird-support/message/118748)

注意: Firebird FAQ はもしデータベースを読み取り専用に設定しないならば、もし、読み取りだけでもデータベースファイルに書き込みアクセスが必要であることを示している(例えば gfixを用いて)。

リンクとさらなる情報

以下のリストはFirebirdと関連するツールのさらなる情報に対するリンクである。

Lazarus Firebird サンプル

ツール

Firebird


From the Free Pascal wiki, page "Firebird/ja", as the Internet Archive kept it on 2025-01-17, last changed on 2024-09-27. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

第3版、最終更新:WikiArchive 。