Firebirdデータベースを一時的なBLOBで「膨らませる」方法
これは「やってはいけない」系の記事の一つです - あくまで例として挙げています。Firebirdデータベースの異常な増大に遭遇した場合、BLOBの連結を使用するストアドプロシージャ、トリガー、またはexecute blockを書いていないか確認してください。
場合によっては、Firebirdは一時BLOBをデータベースファイル内に保存するため、データベースが非常に急速に増大します。
_この問題はHQbirdで修正されており、一時BLOBをデータベース自体ではなく一時フォルダに送信できます。 _
以下の例はこの問題を示しています。多数の小さな一時BLOBを作成し、それらがデータベースファイルに保存されるため、Firebirdデータベースが約2GB「膨張」します(本番環境や重要なデータベースでは実行しないよう注意してください!):
execute block
returns (
BLB blob)
as
declare BLB1 blob;
declare I integer;
begin
I = 0;
BLB = 'blabla';
BLB1 = cast('blablablablablablablablablablablablablabla' as blob);
while (I < 10000) do
begin
BLB = BLB || BLB1;
I = I + 1;
end
suspend;
end
Firebirdはトランザクションのコミット(またはロールバック)まで一時BLOBを保持します。トランザクションをコミットしてからコードをもう一度実行すると、データベースファイルが増大しないことに気づくでしょう。これは、データベース内の一時BLOB用の領域が再利用されるためです。
Firebird Friday JokesはTelegramチャンネルでフォローしてください:https://t.me/firebirdsql