この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
広告
posted by fanblog
2014年09月03日
Firebird で外部DBにレコードを同期的に追加する
最新の Firebird 2.5.3 では、リモートDBに対して操作できる機能も追加されていることを知り、データの同期に使えることがわかった
直接やりたかったことは、マスターテーブルに対してログレコードを出力した際に、別のバックアップDBに対しても同じレコードを出力したいということだった
つまり、 HOST_Aの LOGTABLE に対して INSERTされたら、 HOST_Bの LOGTABLE にも INSERTしたいということ
これを実現するために、 HOST_Aの LOGTABLE に対して以下のようなトリガーを設定すればよい
これでめでたく、レコードの同期ができることになった
※ただし、 INSERTのみ、いわゆる完全なレプリケーション機能とは異なる
※もっとも、各種トリガーを定義すれば、かなりそれに近いことはできそうだが、設定がかなり面倒だ
【広告】
国内最大級の個人向けレンタルサーバー『 ロリポップ!レンタルサーバー 』は、
月額100円(税抜)〜で容量最大120GB!しかも安いだけじゃなく
大人気WordPressの簡単インストール/ウェブメーラーなど
機能も満載!共有/独自SSLもバッチリ対応でセキュリティ対策も万全!
もちろん、オンラインマニュアルやライブチャットなど、
充実したサポートで初心者の方でも安心です。
無料のお試し期間が10日間ありますので、
まずはお気軽にご利用してみてくださいね!
▼ロリポップ!レンタルサーバーはこちら
お名前.com レンタルサーバー
直接やりたかったことは、マスターテーブルに対してログレコードを出力した際に、別のバックアップDBに対しても同じレコードを出力したいということだった
つまり、 HOST_Aの LOGTABLE に対して INSERTされたら、 HOST_Bの LOGTABLE にも INSERTしたいということ
これを実現するために、 HOST_Aの LOGTABLE に対して以下のようなトリガーを設定すればよい
CREATE TRIGGER ON_INSERT_LOGTABLE FOR LOGTABLE
AS
DECLARE sqlstr VARCHAR(128);
DECLARE rmtdb VARCHAR(128) = 'HOST_B:MY_DB.fdb';
DECLARE usernm VARCHAR(32) = 'sysdba';
DECLARE passwd VARCHAR(32) = 'masterkey';
BEGIN
sqlstr = 'INSERT INTO LOGTABLE VALUES(?)';
EXECUTE STATEMENT (:sqlstr) (new.DATA)
ON EXTERNAL DATA SOURCE :rmtdb
AS USER :usernm PASSWORD :passwd;
END
これでめでたく、レコードの同期ができることになった
※ただし、 INSERTのみ、いわゆる完全なレプリケーション機能とは異なる
※もっとも、各種トリガーを定義すれば、かなりそれに近いことはできそうだが、設定がかなり面倒だ
【広告】
国内最大級の個人向けレンタルサーバー『 ロリポップ!レンタルサーバー 』は、
月額100円(税抜)〜で容量最大120GB!しかも安いだけじゃなく
大人気WordPressの簡単インストール/ウェブメーラーなど
機能も満載!共有/独自SSLもバッチリ対応でセキュリティ対策も万全!
もちろん、オンラインマニュアルやライブチャットなど、
充実したサポートで初心者の方でも安心です。
無料のお試し期間が10日間ありますので、
まずはお気軽にご利用してみてくださいね!
▼ロリポップ!レンタルサーバーはこちら
お名前.com レンタルサーバー
2014年07月17日
FbConsole の対話型SQLツールが、自身の提示したSQLを受け付けない
ここでも
紹介したが、FbConsole は便利でもバグがあるという話なのだが、また別のやつが見つかった
プロシージャを定義し、その定義をツールのメタ情報から抜き取ったSQLを、FbConsole から流すと、なぜかエラーとなってしまう
ただし、同じSQLを isql ツールから流す場合は大丈夫なので、SQLを流すシーンによってエラーがあったりなかったりということになってしまうのであった
isqlではOKなのに、FbConsole ではダメな例)
両方で大丈夫にするためには、途中の改行をいくつか取り除く必要がある
minne
全ての写真をオンラインで管理
月額300円〜で容量無制限・無期限
●●30 days Album PRO●●
プロシージャを定義し、その定義をツールのメタ情報から抜き取ったSQLを、FbConsole から流すと、なぜかエラーとなってしまう
ただし、同じSQLを isql ツールから流す場合は大丈夫なので、SQLを流すシーンによってエラーがあったりなかったりということになってしまうのであった
isqlではOKなのに、FbConsole ではダメな例)
set term ^^;
create procedure WV_TAB_A
(
rangeMin integer,
rangeMax integer
)
returns
(
UNIQID integer,
HOSTNM varchar(64)
)
AS
BEGIN
FOR SELECT UNIQID,HOSTNM FROM TAB_A WHERE UNIQID BETWEEN :rangeMin AND :rangeMax
INTO :UNIQID, :HOSTNM
DO SUSPEND;
END
^^
set term ;^^
両方で大丈夫にするためには、途中の改行をいくつか取り除く必要がある
set term ^^;
create procedure WV_TAB_A (
rangeMin integer, rangeMax integer
) returns (
UNIQID integer,
HOSTNM varchar(64)
) AS
BEGIN
FOR SELECT UNIQID,HOSTNM FROM TAB_A WHERE UNIQID BETWEEN :rangeMin AND :rangeMax
INTO :UNIQID, :HOSTNM
DO SUSPEND;
END
^^
set term ;^^
minne
全ての写真をオンラインで管理
月額300円〜で容量無制限・無期限
●●30 days Album PRO●●
2014年07月15日
FbConsole が間違ったSQLを提示する
Firebird データベース管理コンソールとして、昔からある FbConsole.exe を使い続けている
これは使いやすく重宝しているのだが、今となってはいくつかバグがあり、注意を要する
1) まず、一旦ログインし、ログアウトするとログインできなくなる (プログラムを起動し直す必要がある)
2) テーブル表示ペインで、UTF-8文字列が化けてしまう
そしてさらに今回発見したのが、メタ情報から取得できるトリガーSQLが、不正な文法になっているケースである
例えば、以下のようなトリガーを作る
これをデータベースのメタ情報SQLで見てみると以下のようになってしまう
どこがまずいかというと、2行目の ACTIVE POSITION 0という部分である
この部分は正しくは ACTIVE BEFORE INSERT OR UPDATE POSITION 0でなくてはならない
信用してこのまま流してしまうと、エラーとなりトリガーが作成されないままとなってしまう
プログラム自体を直すことは今となってはもう無理なので、手作業で対処するしかない
これは使いやすく重宝しているのだが、今となってはいくつかバグがあり、注意を要する
1) まず、一旦ログインし、ログアウトするとログインできなくなる (プログラムを起動し直す必要がある)
2) テーブル表示ペインで、UTF-8文字列が化けてしまう
そしてさらに今回発見したのが、メタ情報から取得できるトリガーSQLが、不正な文法になっているケースである
例えば、以下のようなトリガーを作る
CREATE TRIGGER MY_TEST_TRIGGER FOR TEST_TABLE
BEFORE INSERT OR UPDATE
AS
BEGIN
new.RecordTimestamp = current_timestamp;
END
これをデータベースのメタ情報SQLで見てみると以下のようになってしまう
CREATE TRIGGER "MY_TEST_TRIGGER" FOR "TEST_TABLE"
ACTIVE POSITION 0
AS
BEGIN
new.RecordTimestamp = current_timestamp;
END
どこがまずいかというと、2行目の ACTIVE POSITION 0という部分である
この部分は正しくは ACTIVE BEFORE INSERT OR UPDATE POSITION 0でなくてはならない
信用してこのまま流してしまうと、エラーとなりトリガーが作成されないままとなってしまう
プログラム自体を直すことは今となってはもう無理なので、手作業で対処するしかない
2014年06月30日
Firebird テキスト項目に入る数値でソートする
プライマリキーを varchar で定義しておいて、ジェネレータで自動連番を設定しているテーブルでソート順が乱れる現象が発生し、「あっ」と言ってしまう事案があった
本当はジェネレータで桁数が埋まるくらいの初期値をセットしておけば問題なかったのだが、うっかり忘れていたか、桁数を間違えていた可能性がある
テーブル定義
本来なら、この定義の後で以下のSQLを発行しておくべきであった
取りあえず、解決策はSQLの修正だが、CAST が使えることがわかった
パフォーマンスの低下がどの程度なのかまでは評価していないが、後で調べてみようと思う
月額900円(税抜)〜で大容量100GB〜・マルチドメイン無制限の共用サーバー
◆ お名前.com レンタルサーバー
【キャンペーン情報】
今なら、初期費用&月額最大3ヶ月分無料!
【利用料金】
初期費用1,890円(税込)/月額料金945 円(税込)〜
【主な機能】
・サーバー容量:100 GB〜
・マルチドメイン設定:無制限
・データベース(MySQL):30個〜
・サブドメイン設定:無制限
・メールアカウント数:無制限
・メーリングリスト:最大50個5つまで作成可能
・高機能迷惑メールフィルター(オプション)
・高機能アクセス解析
・CGI / Perl / PHP5 / Ruby / Python / 対応
【アプリケーション】
・WordPress / Movable Type かんたんインストール
・PukiWiki/XOOPS Cube/phpBB/Joomla!/OpenPNE
【セキュリティ】
共用SSL/独自SSL(オプション)
【サポート】
24時間365日の安心電話サポート(無料)
詳細はこちら
本当はジェネレータで桁数が埋まるくらいの初期値をセットしておけば問題なかったのだが、うっかり忘れていたか、桁数を間違えていた可能性がある
テーブル定義
CREATE TABLE TAB_A
(
ID VARCHAR(10) NOT NULL PRIMARY KEY
)
本来なら、この定義の後で以下のSQLを発行しておくべきであった
SET GENERATOR GEN_AUTO_ID TO 1000000000
取りあえず、解決策はSQLの修正だが、CAST が使えることがわかった
SELECT * FROM TAB_A ORDER BY CAST(ID AS NUMERIC(10))
パフォーマンスの低下がどの程度なのかまでは評価していないが、後で調べてみようと思う
月額900円(税抜)〜で大容量100GB〜・マルチドメイン無制限の共用サーバー
◆ お名前.com レンタルサーバー
【キャンペーン情報】
今なら、初期費用&月額最大3ヶ月分無料!
【利用料金】
初期費用1,890円(税込)/月額料金945 円(税込)〜
【主な機能】
・サーバー容量:100 GB〜
・マルチドメイン設定:無制限
・データベース(MySQL):30個〜
・サブドメイン設定:無制限
・メールアカウント数:無制限
・メーリングリスト:最大50個5つまで作成可能
・高機能迷惑メールフィルター(オプション)
・高機能アクセス解析
・CGI / Perl / PHP5 / Ruby / Python / 対応
【アプリケーション】
・WordPress / Movable Type かんたんインストール
・PukiWiki/XOOPS Cube/phpBB/Joomla!/OpenPNE
【セキュリティ】
共用SSL/独自SSL(オプション)
【サポート】
24時間365日の安心電話サポート(無料)
詳細はこちら
2014年06月25日
Firebird でパラメータ指定できるビューを作る
久しぶりに Firebird のプロシージャを書きたくなったのだが、相変わらず SQL 関連の文法は毎回忘れているので、またメモしておくことにする
今回やりたいのは、パラメータ付ビューだ
使い方は以下のようである
こいつの定義文法は
パラメータリスト、戻り値リスト共に以下の文法に従う
戻り値の返し方がちょっと面倒な書き方になっているが、概ね以下のようになる
仮引数などの指定に :変数名 のように ':' コロン を頭につけるという点が、うっかりしがちなので気を付ける必要がある
※大抵は文法エラーで指摘してくれるのでわかるが
ショップサーブ
今回やりたいのは、パラメータ付ビューだ
使い方は以下のようである
SELECT * FROM PARAM_VIEW(パラメータ)
こいつの定義文法は
CREATE PROCEDURE プロシージャ名 (パラメータリスト)
RETURNS (戻り値リスト)
AS
[ ローカル変数定義 ]
BEGIN
[ 処理ステートメント ]
END
パラメータリスト、戻り値リスト共に以下の文法に従う
仮引数名 型名 [, ...]
戻り値の返し方がちょっと面倒な書き方になっているが、概ね以下のようになる
FOR SELECT * FROM テーブル WHERE 条件指定
INTO :戻り値変数 [, ...]
DO SUSPEND;
仮引数などの指定に :変数名 のように ':' コロン を頭につけるという点が、うっかりしがちなので気を付ける必要がある
※大抵は文法エラーで指摘してくれるのでわかるが
ショップサーブ
2014年06月07日
Firebird のデータベースURL指定 (Jaybird)
開発では、DBによく Firebird を使ったりしている
ファイルが単一で結構扱いやすいからだ
自分の開発では Java から使うことがほとんどなので、 Jaybird (ODBC driver for Firebird) 経由でアクセスすることになるのだが、しばらくやっていないと、接続文字列をどう書くのかを結構忘れてしまうものだ
あらためて調べてみたが、やはり簡易な方式か Linux 向けの記事ばかりで、急ぎの仕事ではとうとう間に合わなかった
テスト環境は Windows 版なので、ドライブ文字をどう入れるのかをすっかり忘れてしまい、結局、 Firebird の稼働しているドライブ(C:ドライブ)にDBファイルをコピーして、その場をしのいだ
やはり正解が知りたくなり、改めて調べてみたら、
http://www.firebirdsql.org/file/documentation/drivers_documentation/Jaybird_2_1_JDBC_driver_manual.pdf
に解説が載っていた
自分の失敗例
DataSource=jdbc:firebirdsql:d:/database/test.fdb
正解
DataSource=jdbc:firebirdsql:localhost:d:/database/test.fdb
要は、ホスト名を省略しなければ、ドライブを D: などと書けるのであった
これを知らずに ///d:/ や /d:/ などと書いて、一向に埒が明かなかったのであった
焦っているときは、正解ページをなぜか引けないものなのかもしれない
ファイルが単一で結構扱いやすいからだ
自分の開発では Java から使うことがほとんどなので、 Jaybird (ODBC driver for Firebird) 経由でアクセスすることになるのだが、しばらくやっていないと、接続文字列をどう書くのかを結構忘れてしまうものだ
あらためて調べてみたが、やはり簡易な方式か Linux 向けの記事ばかりで、急ぎの仕事ではとうとう間に合わなかった
テスト環境は Windows 版なので、ドライブ文字をどう入れるのかをすっかり忘れてしまい、結局、 Firebird の稼働しているドライブ(C:ドライブ)にDBファイルをコピーして、その場をしのいだ
やはり正解が知りたくなり、改めて調べてみたら、
http://www.firebirdsql.org/file/documentation/drivers_documentation/Jaybird_2_1_JDBC_driver_manual.pdf
に解説が載っていた
自分の失敗例
DataSource=jdbc:firebirdsql:d:/database/test.fdb
正解
DataSource=jdbc:firebirdsql:localhost:d:/database/test.fdb
要は、ホスト名を省略しなければ、ドライブを D: などと書けるのであった
これを知らずに ///d:/ や /d:/ などと書いて、一向に埒が明かなかったのであった
焦っているときは、正解ページをなぜか引けないものなのかもしれない