firebird

首页firebird
10
Aug
0

生成自动编号 修改字段大小

select

CAST(RDB$GET_CONTEXT('USER_TRANSACTION',

IIF(RDB$SET_CONTEXT('USER_TRANSACTION', 'RecNo',
COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'RecNo') AS INTEGER), 0) + 1) = '1',
'RecNo', 'RecNo'))
AS INTEGER) as f_id from T_SELL

//
alter table t_updatelog ALTER F_REMARK TYPE varchar(8000);

10
Aug
0

FireBird数据库自动备份

// DPR文件
program FirebirdDBBak;

uses
Forms,
SysUtils,
untMain in 'untMain.pas' {Form1};

{$R *.res}

var
i: Integer;
bShowMainForm: Boolean;
begin
//判断程序启动参数
bShowMainForm := True;
if ParamCount <> 0 then

for i := 1 to ParamCount do
  if SameText(ParamStr(i), '-h') or SameText(ParamStr(i), '/h') then
    bShowMainForm := False;

Application.Initialize;
Application.ShowMainForm := bShowMainForm;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
// End Dpr文件

// Pas 文件
unit untMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls, Menus, StdCtrls, ComCtrls, CnClasses, Registry,
CnTrayIcon, IniFiles, ShellAPI;

type
TForm1 = class(TForm)

lblDataBaseFile: TLabel;
lblBAKFile: TLabel;
edtDataBaseFile: TEdit;
edtBAKFile: TEdit;
lblBakTime: TLabel;
dtpBakTime: TDateTimePicker;
btnRunBAK: TButton;
CnTrayIcon1: TCnTrayIcon;
PopupMenu1: TPopupMenu;
mniShowMainForm: TMenuItem;
mniExit: TMenuItem;
dlgOpen1: TOpenDialog;
dlgSave1: TSaveDialog;
tmr1: TTimer;
btnSetDBPath: TSpeedButton;
btnSetBAKPath: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure tmr1Timer(Sender: TObject);
procedure btnRunBAKClick(Sender: TObject);
procedure mniShowMainFormClick(Sender: TObject);
procedure mniExitClick(Sender: TObject);
procedure btnSetDBPathClick(Sender: TObject);
procedure btnSetBAKPathClick(Sender: TObject);

private

Atom: Integer;
FBPath: string;
procedure InitForm;

public

{ Public declarations }

end;

function FixPathStr(path: string): string;

var
Form1: TForm1;

implementation

{$R *.dfm}

function FixPathStr(path: string): string;
begin
//这个函数的功能只可意会, 自己看吧
if pos(' ', path) = 0 then

Result := path

else

Result := '"'+ path+ '"';

end;

procedure TForm1.btnSetDBPathClick(Sender: TObject);
begin
//设置Firbird数据库文件位置
dlgOpen1.InitialDir := edtDataBaseFile.Text;
if dlgOpen1.Execute then

edtDataBaseFile.Text := dlgOpen1.FileName;

end;

procedure TForm1.btnSetBAKPathClick(Sender: TObject);
begin
//设置备份文件位置
dlgSave1.InitialDir := edtBAKFile.Text;
if dlgSave1.Execute then

edtBAKFile.Text := dlgSave1.FileName;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//清除全局原子
GlobalDeleteAtom(Atom);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//主窗体隐藏
Self.Hide;
CanClose := False;
end;

procedure TForm1.InitForm;
begin
//设置各控件的参数
tmr1.Interval := 50000; //Timer事件的频率
dtpBakTime.Kind := dtkTime; //DateTimePicker控件的类型为时间型
CnTrayIcon1.PopupMenu := PopupMenu1; //TrayIcon与PopupMenu关联
CnTrayIcon1.UseAppIcon := True; //使用应用程序的图标做为任务栏上的图标
end;

procedure TForm1.FormCreate(Sender: TObject);
var
reg: TRegistry;
ini: TIniFile;
begin
//检查Firebird安装情况
reg := TRegistry.Create;
try

reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('\SOFTWARE\Firebird Project\Firebird Server\Instances', False)  then
  FBPath := reg.ReadString('DefaultInstance')
else
begin
  MessageDlg(PChar('此计算机未安装Firebird!'),  mtInformation, [mbOK], 0);
  Application.Terminate;
end;

finally

FreeAndNil(reg);

end;

//全局原子检查, 判断程序是否已经运行
if GlobalFindAtom('seidb_backup') = 0 then

Atom := GlobalAddAtom('seidb_backup')

else
begin

MessageDlg(PChar('程序已经在运行!'),  mtInformation, [mbOK], 0);
Application.Terminate;

end;

InitForm;
ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+ 'Path.ini');
try

edtDataBaseFile.Text := ini.ReadString('Path', 'fdb', '');
edtBAKFile.Text := ini.ReadString('Path', 'fbk', '');
dtpBakTime.Time := StrToTime(ini.ReadString('Time', 'Time', '12:00:00'));

finally

FreeAndNil(ini);

end;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
if FormatDateTime('hh:mm', dtpBakTime.Time) <> FormatDateTime('hh:mm',Now) then

Exit;

btnRunBAK.Click;
end;

procedure TForm1.btnRunBAKClick(Sender: TObject);
var
fdb, fbk, CmdLines, binpath: string;
days: array[1..7] of string;
begin
//手动备份
if (edtDataBaseFile.Text = '') or (edtBAKFile.Text = '') then

Exit;

Screen.Cursor := crHourGlass;
tmr1.Enabled := False;
btnRunBAK.Enabled := False;
try

days[1] := 'Sunday';
days[2] := 'Monday';
days[3] := 'Tuesday';
days[4] := 'Wednesday';
days[5] := 'Thursday';
days[6] := 'Friday';
days[7] := 'Saturday';
fdb := FixPathStr(edtDataBaseFile.Text);
fbk := edtBAKFile.Text;
fbk := ChangeFileExt(fbk, '');
fbk := fbk+ '_'+ days[DayOfWeek(Date)]+ '.fbk';
fbk := FixPathStr(fbk);
binpath := FBPath+ 'bin\';
CmdLines := Format(' /c gbak -v -t -user SYSDBA -password "masterkey" %s %s',
      [fdb, fbk]);
ShellExecute(handle, 'open', pchar('cmd'), pchar(CmdLines), pchar(binPath), SW_HIDE);

finally

btnRunBAK.Enabled := True;
tmr1.Enabled := True;
Screen.Cursor := crDefault;

end;
end;

procedure TForm1.mniShowMainFormClick(Sender: TObject);
begin
//
Self.Show;
end;

procedure TForm1.mniExitClick(Sender: TObject);
var
ini: TIniFile;
begin
//保存参数,退出程序
ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'path.ini');
try

ini.WriteString('Path', 'Fdb', edtDataBaseFile.Text);
ini.WriteString('Path', 'Fbk', edtBAKFile.Text);
ini.WriteString('Time', 'Time', FormatDateTime('hh:mm', dtpBakTime.Time));

finally

FreeAndNil(ini);

end;

Application.Terminate;
end;

end.
// End Pas 文件
Firebird数据库备份:把下面的一行保存为备份.bat文件,在备份时只要双击运行即可,非常方便

gbak.exe -b 192.168.4.146:Data.FDB D:Data.fbk -user sysdba -password masterkey

当原来的数据库有很多数据时,可能超过10G,这时备份会非常花时间,可以先把数据库的元数据备份下来,根据需要再用sql把要用的表导入即可:

gbak.exe -b -m 192.168.4.3:pim D:pim.fbk -user sysdba -password masterkey

加参数-m就可以把数据库的表名、存储过程、触发器等全部备份下来,成为一个“空库”, 然后再新建一个数据库,把刚才备份的数据库还原过来,就可以得到一个干净的空库,然后在IBExpert里,打开这两个数据库,在要复制数据的库里执行sql:

insert into [空库在IBExpert里的注册名].表名 select from 要复制的表名,则可以把数据导入到空库里。 但是在空库里执行insert into 表名 select from [要复制的数据库在IBExpert里的注册名].表名,却提示出错,管它的,只要有一种方法行就成。

另外用Casestudio工具就可以把刚才还原的空库的数据库脚本反向生成SQL,有了这个SQL,就可以生成一个空库。本来在IBExpert里可以导出元数据为SLQ的,但有些存储过程导出后生成SQL语句,再生成数据库时会创建失败。

现在感受到了Firebird的强大了吧!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/c_huabo/archive/2010/09/08/5870754.aspx

Firebird的备份工具(nbackup)介绍

 阅览次数: 今天:0 总浏览:847 
 文章来源: CodePub整理 
 原文作者: 
 整理日期: 2008-05-03 
 发表评论 
 字体大小: 
 小 
 中 
 大 

nbackup介绍
nbackup是Firebird 2.0新带来的备份工具。它提供了gbak—Firebird以前就有的备份工具—所没有的能力—但是并不取代后者。两个程序都有其长处和短处;他们在一定的将来将共存一段时间。

nbackup功能—总体介绍
使用nbackup,你可以进行两类不同的功能操作:
1. 建立和恢复完整的和增量的备份操作。一个增量备份只包括自某一上次备份以后的变化。
2. 锁定主数据库文件,然后你可以根据自己的选择使用复制工具或者备份工具来备份。在这种模式下,nbackup不备份任何东西;它只是创建了一个你自己可以安全地进行备份的条件。这里也有一个恢复的环境。
两个模式都可以在活动数据库上操作,而不影响已经连接的用户。产生的备份总是反应操作开始时数据库的状态。在这些方面,nbackup和gbak并无差别。

nbackup的优势
. 两个模式:高速(达到硬件和操作系统允许的速度),因为nbackup不注意实际的数据。在备份模式里内容是原封不动地写进备份文件。
. 备份/恢复模式:节约了时间及磁盘空间:因为不需要每次都完整地备份。这在数据库文件大小达到G级别上时产生巨大的差异。
. 锁定/解锁模式:可自由选择备份,复制,及/或压缩工具。

nbackup的局限
. nbackup不象gbak那样清扫(sweep)和压缩你的数据库文件。
. 与gbak不一样,你不能在nbackup循环中修改数据库的拥有者。
. nbackup不能建立可移动的备份,即:你可以在不兼容的平台或者另一个服务器版本下恢复的那种备份。
. 在目前状态下,nbackup不应该使用在多文件数据库上。
. nbackup只能备份本地数据库。

我们将在下面的章节中广泛阐述nbackup的各种功能。

建立和恢复备份
首先,nbackup.exe位于你的Firebird文件夹的bin自文件夹里。通常位置如C:Program FilesFirebirdFirebird_2_0bin(Windows)或者 /opt/firebird/bin(Linux)。与其他Firebird所有的工具一样,nbackup没有图形界面,你需从命令行启动它(或者从一个批处理文件或者应用程序)。

完整备份
进行完整备份,要进行一个数据库的完整备份,语法如下:
nbackup [-U <user> -P <password>] –B 0 <database> [<backupfiile>]
例如:
C:Data> nbackup –B 0 inventory.fdb inventory_1-Mar-2006.nbk
说明:
. 参数 –B表示备份(嘿)。备份级别0表示完整备份。备份级别大于0用于增量备份,我们后面再讨论。
. 除了数据库文件名字,你也可以使用别名。
. 除了使用备份文件名字,你也可以使用stdout.这会把备份输出到标准输出,在那里你可以把它重定向到如磁盘机或者压缩工具里。
. –U(user)和-P(password)参数可以省略:

  • 如果你以超级用户登陆(root, administrator…)或者已经设置了环境变量ISC_USER和ISC_PASSWORD。
    为了清晰和简洁起见,例子中没有使用这些参数。

. 不同的参数(-B, -U和-P)可以任何次序出现。当然每一个参数都应紧跟其响相应的变量。对于-B,有三个:备份级别,数据库文件和备份文件,按这个顺序。
. 如果-B参数最后出现,你可以省略备份文件名。这时nbackup将按照数据库文件名,备份级别和当前日期和时间设置一个文件名。如果同一分钟内两个相同级别的备份命令执行时会导致名称冲突(引起备份失败)。

内部工作的一个说明
注:下面所述内容不是使用nbackup必须的知识。只是一个简单的(不完整的)对nbackup –B执行时内部到底发生了什么的说明

  1. 首先,主数据库文件被更改一个内部状态标志后锁定。从这一刻开始,任何及所有对数据库的更改都暂时写到一个临时文件里-差异文件或者增量文件
  2. 然后是进行实际的备份操作。这不是一个直接的文件复制;恢复也必须使用nbackup来进行。
  3. 在备份操作完成后,增量文件里的内容被集成到主数据库文件里。然后数据库被解锁(标志恢复到“正常”),增量文件被删除。
    步骤1和3是由两个新的SQL语句:ALTER DATABASE BEGIN BACKUP和ALTER DATABASE END BACKUP.于字面意思相反,这两个命令根本不进行实际的备份操作;他们只是建立了主数据库文件可以被安全地备份的条件。实际上,你不需要自己执行这两个命令,nbackup会替你在正确的时间执行他们。

恢复一个完整备份
一个完整备份如下方法恢复:
nbackup [-U <user> -P <password>] –R <database> [<backupfile>]
例如:
C:DATA> nbackup –R inventory.fdb inventory_1-Mar-2006.nbk
注:
. 你不用指定一个备份级别
. 恢复时,-R参数必须最后一个出现,理由后面会清楚。
. 如果指定的数据库已经存在,而且没有任何条件,它将被毫无提示地覆盖!如果有用户连接,备份将失败,你会得到一个错误信息。
. 这里也一样,你可以省略备份文件名。如果你省略了,nbackup会提示你给予一个。但是,目前这个功能是没有(至少在Windows环境下),如果你这样指定备份文件,你会得到一个错误信息,然后备份失败。

增量备份
进行增量备份
要进行一个增量(差异)备份,我们指定一个大于0的备份级别。一个N级的增量备份总是包含自从最近的N-1级的备份以后的变化。
例如:
完整备份(级别0)一天后,你进行一个级别1增量备份:
C:Data> nbackup –B 1 inventory.fdb inventory_2-Mar-2006.nbk
这个备份只包含最近一天的变化。
一天以后你又进行了一个1级增量备份:
C:Data> nbackup –B 1 inventrory.fdb inventory_3-Mar-2006.nbk
这个备份包含最近2天的变化,从完整备份开始,而不是从前一个1级备份开始。
几个小时后,我们进行了一个2级备份:
C:Data> nbackup –B 2 inventory.fdb inventory_3-Mar-2006_2.nbk
这个最新的备份,只包含最近的1级备份后的变化,就是说最近几个小时的变化。

恢复增量备份
当恢复增量备份时,你需要指定整个增量备份文件链,从0级至你希望恢复的那一个。数据库总是从头开始建立的,一步一步的。(就是因为是一步一步增加直到数据库恢复完成,产生了“增量备份”这个名词。)
正规语法如下:
nbackup [-U <user> -P <password>]
-R <database> [<backup0> [<backup1> […]]]
所以从前面的例子上恢复一个2级备份的情况如下:
C:Data> nbackup –R inventory.fdb inventory_1-Mar-2006.nbk
Inventory_3-Mar-2006.nbk inventory_3-Mar-2006_2.nbk
当然命令行在这里因为排版的原因分行了,实际操作时,需要输入整个语句,到最后才输入enter回车键。

注(在恢复完整备份的说明的基础上):
. 因为事先不知道-R开关后面跟多少个文件名(因为我们恢复时不指定级别),nbackup假设-R后所有的变量都是备份文件的名字。因为这个原因,文件名列对后不能跟其他参数(-U,-P)。
. 备份级别没有一个正式的限制,但是实际操作中,超过3或者4是很少见的。

不相连的链接
如果你不小心漏了一个文件,或者指定了一个不属于同一系列的文件会发生什么情况呢?你可以想象在上面的例子中错误地指定了inventory_2-Mar-2006.nbk而不是inventory_3-Mar-2006.nbk。两个都是1级备份文件,所以两种情况下都获得一个挺好的“0,1,2”级别系列。但是我们的2级文件是基于March 3的1级备份的增量备份,而不是March 2的增量备份。幸运的是这样的错误永远不会导致一个错误的数据库恢复。每一个备份文件都有一个独特的ID。更进一步的是,每一个1级或者更高级的备份文件都包含它所基于的备份的ID。恢复时,nbackup检查这些ID;如果链中某处链接不相连,操作被取消,你会得到一个错误信息。

一个实际运用
一个基于nbackup的增量备份计划可能象这样的:
. 每个月进行一次完整备份(0级别);
. 每个星期一个1级;
. 每天一个2级备份;
. 每小时一个3级备份。

只要所有的备份都保留者,你可以把数据库恢复到过去任意一个小时的状态。对于每个恢复操作,最多使用4个备份文件。当然,你也可以这样规划,在非高峰时间进行更大的,更耗时的备份。这样的话,0级和1级别粉可以在周末进行,而2级的则可以在晚上进行。

如果你不想把所有的东西都永久保存,你还可以增加一个删除计划:
. 3级备份可以在8天后删除;
. 2级备份可以在一个月后删除;
. 1级的可以在6个月后删除;
. 完整备份2年后删除,但每年的第一个仍然保留。

当然这只是一个例子。对个例来说什么管用还要依据应用,数据库的大小,它的活动程度等等。

到此,你已经了解了使用nbackup进行和恢复完整的或者增量的备份所需要的所有知识了。只需要进一步阅读一下,就可以选择你想用的工具操作你的Firebird数据库(见锁定和解锁),或者你希望覆盖变化文件默认的名称或位置(见设置变化文件)

如果你没有了解那些的欲望:祝你在使用nbackup的过程中顺利!

锁定和解锁
如果你希望使用自己的备份工具或者只是想做一份拷贝,nbackup的锁定-解锁模式可以派上用场了。“锁定”意味着主数据库文件暂时冻结了,不是说不能对数据库文件进行任何更改。象在备份模式中一样,变化被指向一个临时的增量文件:解锁后增量文件会别复合到主文件中去。
提醒一下:nbackup.exe文件位于你的Firebird文件夹的bin子目录里。一般的位置是如: C:Program FilesFirebirdFirebird_2_0bin(windows)或者 /opt/firebird/bin(Linux)。没有图形界面;你必须从命令行启动(或者从批处理文件或者应用程序中)。

锁定数据库并自己备份
一个你用来进行自己的备份典型的会话是这样的:

  1. 使用 –L(锁定)开关锁定数据库:
  2. [-U <user> -P <password>] –L <database>
  3. 现在按照你的想法复制/备份/压缩数据库文件,使用你自己选择的工具。单纯复制一下文件也是可以的。
  4. 使用-N(解锁)开关解锁数据库:
  5. [-U <user> -P <password>] –N <database>

最后一个命令将使所有变化-写在增量文件里- 复合到主文件中去。你建立的备份文件包含了数据库在被锁定的瞬间所有的数据,不管锁定状态持续了多久,也不管你在进行实际备份前等待了多久。

从一个nbackup –L建立的备份中恢复
一个锁定的数据库文件的拷贝本身也是个锁定的数据库,所以你不能只是复制回来然后直接使用它。如果你原来的数据库文件丢了或者损坏了,因而自己做的拷贝需要恢复(或者你需要在另一台机器上安装),按如下方法操作:

  1. 使用必要的工具,复制/恢复/解压你自己制作的备份文件
  2. 现在使用-F(Fixup修正),而不是-N开关,解锁数据库:
  3. –F <database>

为什么有两个解锁开关,-N和-F?
. –N首先检查-L锁定后的变化复合到主数据库文件。然后,数据库文件恢复到正常的读写模式,并且临时文件被删除。
. –F 只是改变自己恢复的数据库状态标志到“正常”。
所以,你可以使用:
. –N,在进行你的复制/备份操作后(逆转前面所说的 -L);
. –F,在恢复一个你那样制作的备份文件后。

内幕
注:这一节不包含任何必须的知识,但提供一些额外的信息,可以加深你理解不同的开关。
nbackup –L进行如下操作:

  1. 连接到数据库;
  2. 启动一个事务;
  3. 调用ALTER DATABASE BEGIN BACKUP(这个语句在nbackup –B的额外信息中讨论过);
  4. 提交事务;
  5. 断开数据库的连接。

nbackup –N遵照同样的步骤,但第三步使用“… END BACKUP”。

nbackup –F 进行如下操作:

  1. 恢复的数据库被打开;
  2. 在文件里,状态标志被从锁定状态(nbak_state_stalled)修改至正常(nbak_state_normal);
  3. 文件又被关闭。

设置增量文件
默认地,增量文件存于数据库文件所在的文件夹里。文件名和数据库文件相同,但后缀是.delta。一般没有什么理由去改变,但需要的时候也可以做到—虽然不是使用nbackup本身。使用任何一个可以允许你输入自己SQL语句的客户连接到数据库,输入以下命令:
alter database add difference file ‘path-and-filename’
定制的增量文件是和数据库文件一体的,他保存在系统表RDB$FILES里。要恢复至默认状态,输入以下语句:
alter database drop difference file

A. 文档历史
确切的文件历史记录在我们的CVS树的manual模块中,详见http://sourceforge.net/cvs/?group_id=9028

修改历史
0.1 21 Oct 2005 PV 第一版
1.0 1 Dec 2006 PV 在版信息中删除了“Beta”记号。修改了使用nbackup –R交互指定备份文件的警告。在文档历史中删除了“(或者将要)”。
将例子中的C:Database修改为C:Data,避免语句行跑出PDF的阴影部分。
增加了章节“设置增量文件”,并相应修改了“继续阅读”部分

B. 许可说明
本文件的内容遵照Public Documentation License Version 1.0(“许可”);你只能在遵守“许可”的情况下使用。“许可”的副本可在http://www.firebirdsql.org/pdfmanual/pdl.pdf(PDF)和http://www.firebirdsql.org/manual/pdl.html(html) 得到。
原始文件名为: Firebird之nbackup工具。
原始文件的起草者为:Paul Vinkenoog.
Copyright? 2005,2006. All Rights Reserved. 请联系起草作者:paulvink at users dot sourceforge dot net

浴火重生的Firebird

  “火鸟是传说中的不死鸟,它可以穿越时空,不死不灭,阿拉伯人叫它费利克斯,中国人则称它们为凤凰,火鸟不会死亡,它们会在火中重生……”
——手冢治虫

  Firebird(火鸟)是一个“开放源代码”的大型关系数据库管理系统,具有跨平台、高并发、高性能等特点,被很多应用系统采用。其独创的多代体系结构,与目前流行的其他关系数据库管理系统截然不同。Firebird自1984年诞生以来,稳步向前发展,历经几次名称变更,如传说中的火鸟,每次都在烈火中重生、升华。

发展历程

  Firebird见证了关系数据库从无到有,从发展到壮大的历史进程。让我们回到过去吧,亲身感受一下Firebird的次次烈火重生!

  上世纪70年代,在数据库领域,网状数据库和层次数据库占绝对统治地位。1970年,IBM的研究员E.F.Codd博士在刊物Communication of CAM上发表了“A Relational Model of Data for Large Shared Data Banks”论文,奠定了关系模型的理论基础。从此以后,很多厂商、学校加入关系数据库的研发热潮。

  1975年,一个编写关系数据库的机会驱使Jim Starkey来到了DEC公司,在此期间,Jim Starkey负责设计编写了Datatrieve(一个运行在平面文件和DBMS-32上的关系查询语言)。DEC公司的关系数据库设计小组一直忙于在开会、研究文献、争论问题,没有写一行代码。Jim Starkey等得不耐烦了,就自行研究数据影像技术。在一次早晨沐浴时,当他透过浴室多重窗户看到外面的树林时,灵感突现,意识到数据影像技术也是防止数据更改冲突以及取消失败事务的灵丹妙药。Jim Starkey发明了“多代体系结构”(Multi Generational Architecture)!随后,在兴趣的驱使下,他以多代结构为核心,开始设计自己的数据库管理系统——JED。当DEC的管理层发现公司内部存在两个关系数据库项目时,一场“战争”不可避免地爆发了。结果是,政治谋杀了JRD。

  “如果注定要痛苦,那么我宁愿忍受自己的错误(而不是别人的错误)造成的痛苦”。1984年8月,Jim Starkey离开了工作近10年的DEC公司。1984年9月4日,他独立创业,成立了Groton Database Systems(扩展名gds的由来)公司,开发通用型关系数据库管理系统,JRD获得了新生,JRD变成了Groton。后来,受到客户启发,公司改名为InterBase,其产品由Groton改名为InterBase。他的太太Ann Harrison也加入了公司,负责公司的日常运营,而Jim Starkey则专注于开发。1986年,InterBase推出2.0版;1988年推出3.0版;1989年,VAX/VMS平台上的版本推出;到1991年,HP-UX、DG/UX、Ultrix、SunOS/Solaris、AIX、SCO平台上的版本也相继推出。

  InterBase在当时获得了巨大成功,数千美元一份,附带几个很少的命令行工具。没有利用外资,InterBase自食其力,独立发展了5年。同一年代,ORACLE于1979年夏天发布了第一个版本的商用SOL关系数据库系统,用于DEC公司的PDP-11计算机,不支持事务处理。1983年,IBM公司第一次推出关系数据库产品——DB2 for MVSV1。1984年Sybase公司成立,获得了数千美元的风险投资,于1987年5月推出第一个关系数据库产品Sybase SQLServer 1.0,提出了Client/Server数据库体系结构思想。微软公司与Sybase公司签订了合作协议,于1989年发布了SQL Server 1.0版。从此以后,随着技术的成熟和完善,关系数据库日益流行和普及。

  当时,InterBase能够在ORACLE、DB2、Sybase SQLServer、Informix、MS SQL Server等的夹缝中自力更生,顽强生存了5年,真是个奇迹。

  1991年,Ashton-Tate公司购买了全部的InterBase。随后,InterBase便扩展到了18个操作系统平台上运行。公司管理层不仅好大喜功,不切实际地要求InterBase超过同时代的dBase和Sybase,而且还三心二意,同时投资支持Sybase公司。随后,Jim Starkey独自离开了约65人的InterBase开发团队,这一去便是10多年。

  1992年Borland收购了Ashton-Tate公司,InterBase成为Borland产品中的重要一员。伴随着Borland公司的开发工具,InterBase在全球遍地开花。1994年,Borland公司发布了Interbase 4.0,直到1997年12月1日才发布Interbase 5.0。让全世界人们吃惊的是,2000年7月25日Borland竟宣布Interbase 6.0公开源代码,在全世界关系数据库领域中掀起了一股开源热潮。

  条件已经成熟,准备迎接Firdbird时代吧!

拥抱开源

  摆脱了禁锢的Firebird,海阔天空,自由翱翔吧!

  火山岩熔积聚太久,即将喷发。InterBase的命运应该由用户决定。由于开源的Interbase 6.0不允许外部开发者参与,2000年7月31日,Mark O'Donohue和一群InterBase狂热爱好者遵循IPL(InterBase Public License)v.1.0协议,在Source Forge网站上建立了FirebirdSQL Project项目。自由开放的Firebird诞生了。刚开始处境艰难,他们手中只有“只读”的Interbase 6.0源文件,Borland未公布“makefile”等其它技术细节,不能直接编译运行。另外,缺乏资金支持,毕竟程序员也要吃饭。

  2000年7月28日,InterBase元老级人物Ann Harrison从Borland公司辞职。8月23日,她和Paul Beach带领几个InterBase开发人员成立了IBPhoenix组织,对Firebird用户提供咨询、支持服务,赞助Firebird开发。随后,加拿大公司BroadView也加入了赞助商的行列。为了更好地开展工作,2002年12月12日FirebirdSQL基金会成立,一个非赢利组织,目的是提供一个非商业性基础设施,用来收取、支付基金,推进和支持FirebirdSQL项目和子项目的开发。加入该组织需要每年交付会费,IBPhoenix和BroadView均是金牌会员。FirebirdSQL基金会的委员会决定基金的使用,他们把资金给予那些在关键领域、主线开发的Firebird开发人员。

  万事俱备,全世界那些天才的开发人员开始发力,Firebird该为世人表演那精美绝伦的舞蹈了!2002年3月12日,Firebird 1.0发布。V1.0开发完成后,工作重心转到“将代码从C移植到C++”上面,Firebird 1.5项目成立。经过了三个版本,到2004年12月25日,正式发布了V1.52。

  2001年春天,一群俄罗斯人自立门户,在Firebird基础上,发布了一个商业关系数据库——Yaffil,专注于Windows平台,增强了系统性能,只支持俄语,服务本民族用户。令人高兴的是,2003年11月,Yaffil主动回到了Firebird怀抱,Yaffil新的功能将会融入到Firebird 2.0中。2003年冬天发生了Firebird历史上最重要的一件事:阔别10多年的InterBase之父Jim Starkey又回来了。20年来,他所创建的核心构架一直没有变动。他要带领旧部大干一场,为未来的20年再重新搭建一个新的基础构架!他们进行的项目被称为“Vulcan”。

  Firebird 2.0项目已于2005年2月份开发完成,2005年5月发布。下面列举一些Firdbird 2.0新增加的功能:

  1、对SQL标准支持增强:支持SQL200X标准定义的“派生表”(derived tables)、为了和SQL-99标准一致,引进了“SEQUENCE”,用来代替“GENERATOR”;

  2、经典结构模式(Classic architecture)支持全部API;

  3、支持64位操作系统平台;

  4、内置函数增加;

  5、存储过程语言(PSQL)增强:支持“显式游标”、存储过程支持默认参数、支持“LEAVE标号”语法、将用户自定义函数(UDF)作为存储过程调用等;

  6、索引得到增强:252字节限制取消、支持“表达式索引”等;

  7、改进的优化器;

  8、安全增强:安全数据库结构改变、口令加密更安全、远程不能访问安全数据库、阻止“暴力破解”行为;

  9、在线增量备份。

  Vulcan是和Firebird 2.0并行开发的项目,已于2004年底开发完成。Firebird 2.0正式发布后,Vulcan和Firebird 2.0合并,成为Firebird 3.0。目前最新的发布版本是Firebird 2.1。下面列举一些Vulcan新增加的功能特性:

  1、支持SMP:在一台机器上,Vulcan在4处理器上的基准测试成绩是单处理器的3.5倍。

  2、统一数据库存取体系结构:根据目前流行软硬件技术,核心体系进行了重新梳理更新;原来的“超级服务器模式”、“经典模式”、“嵌入模式”得到统一,用户可根据配置文件指定使用何种模式。

  3、配置文件显著更新:支持级联配置文件。

  4、安全管理器可自定义配置:不同单位需要不同级别的用户权限管理,可由用户加载安全管理器。

  5、数据库引擎集成SQL:DSQL集成到数据库引擎内部,更加高效。

  Firebird 3.0那些新增加的诱人的特性,为Firebird挺进高端市场又增加了一块重要砝码。随着Firebird的成功表现,一些商业数据库也纷纷拥抱开源,多米诺骨牌效应产生了。许多IT公司对开放源代码的立场已经从抵触、怀疑、观望转变为参与直至推动。2004年8月10日,CA公司公布了数据库Ingres r3的源代码。接着IBM公司向Apache捐献了关系数据库Cloudscape,也公开了Cloudscape源代码。另外,据说DB2也要走向开源。

功能特性

  Firebird具备一个完整关系型数据库管理系统(RDBMS)的全部优点,下面列举了一些特性:

  1、支持SQL标准。Firebird完全符合SQL-92标准要求,并与许多ANSI SQL-99、SQL-2003标准项目兼容。通过机连操作、更新视图、外连结,它支持声明引用完整性。Firebird服务器提供了大量的程序库,支持嵌入式SQL和DSQL客户端应用程序开发。在所有的平台上,客户端应用程序能够写成Firebird API形式,通过它向数据库服务器发送操作请求。Firebird还支持扩展SQL特性,部分已经达到了SQL99、SQL2003的标准,包括存储过程、触发器、SQL角色、BLOB段、序列、派生表等。

  2、多代体系结构(MGA)。Firebird采用了多代体系结构(Multi-Generational Architecture:MGA),这是其区别于其它任何大型关系数据库的显著特点,也是使性能大幅提升的关键所在。在MGA体系中,独创了版本事务模式(Versioning Model),与其它数据库系统传统的加锁方式比较而言,应该说这是目前最先进的解决多用户并发访问的方法之一。在多代结构中,会为记录保留多个记录版本,它的卓越之处在于“长的读事务不会堵塞写事务”,因而特别适合涉及到大量客户的大型在线事务处理(OLTP)和需要海量数据的数据决策支持(DSS)的混合应用系统。

  3、卓越的多数据库管理功能以及自动两阶段提交和分布式两阶段提交恢复机制。Firebird是一个多数据库的RDBMS,一个数据库引擎可以同时运行并管理多个数据库,每个数据库都包含自己的数据库对象和事务日志。在跨越2个以上的数据库事务操作中,Firebird提供了良好的两阶段提交和两阶段提交恢复机制,确保了每个数据库数据的一致性。

  4、最简单的安装配置。Firebird是目前世界上安装最快捷、最简单的大型关系数据库。点击几个“Next”便可在5分钟内完成全部安装。建立数据库配置完成后,Firebird自动调节成最优状态运行,无需专职数据库管理员,几乎是零维护。

  5、自动化管理、零维护。Firebird可以及时根据用户的使用情况、操作系统的运行状况,在底层自动调节自身的多项参数以保证其始终运行在最优状态。这种卓越特性使得即便没有专职数据库管理员,整个数据库系统也可以高枕无忧地运行使用,达到了零维护。

  6、齐全的数据库对象。Firebird支持几乎所有大型关系数据库都有的对象,包括数据库、表、列、索引、视图、存储过程、增强的触发器、缺省、规则、约束、用户自定义函数(UDF)等,具备丰富的字段数据类型,特别是支持18位大型精确数字类型,全面满足金融财会等关键业务需求;还支持用户自定义数据类型(域)、支持数组字段、大容量的无格式二进制数据(BLOB)字段,与其它某些数据库系统不同,Firebird的BLOB数据完全是在事务的控制下操作的,并且连同其它数据一起存放在同一个数据库中,确保了对大型数据操作的一致性和效率。

  7、卓越的跨平台特性、支持多种网络协议。Firebird可以在所有的Windows操作系统、各种Linux发行版本、各种Unix及Unix的后代等操作系统平台上安装运行,其优越性不仅仅在于这些平台的透明性,更重要的是这些平台间数据的无缝连接,你只要使用简单的备份和恢复操作,就可以把一种平台中的数据顺利移植到另一种平台中正常使用,一点都不需要其它复杂转换。Firebird支持多种网络协议,所有平台的Firebird均支持TCP/IP;Windows平台上的Firebird支持NetBEUI/named pipes;服务器版的Firebird和所有Windows客户端均支持IPX/SPX。

  8、最方便的客户端安装。Firebird的嵌入式版本一张软盘容量,既可以作为本地单机版的服务器,也可以作为远程服务器的客户端,可以将这几个文件打包到应用程序安装盘中。应用程序安装后系统即可连接远程服务器运行,不用再单独安装Firebird的客户端。

  9、灵活性、高可靠性、安全性和可扩充性。Firebird具备完善的用户管理和权限管理,确保了数据库的安全,其强大的联机事务处理功能可以边进行数据库操作边进行数据库备份。Firebird的异步取消机制可以让用户方便地取消正在执行的操作,特别是当运行较长的或复杂的查询影响数据库性能时。XML功能可以让用户直接从Firebird数据库中创建XML文档。Firebird的自动崩溃恢复能力使得在断电或其它故障导致系统崩溃时完全可以在没有专职数据库管理员的干预下自动、及时、快速地进行数据恢复,用户需要做的就是接通电源让数据库工作,其他一切都交给Firebird处理。此外,可以为数据库创建分布式镜像,进一步确保Firebird的可靠性。无论是单用户应用还是企业级应用、无论桌面版还是服务器版,Firebird均使用统一的底层代码,极大地方便了用户的扩展。

  10、最广泛的管理工具、开发工具的支持。其范围之广、数量之多,是其他数据库所不能比的。

  Firebird与其它所有关系数据库的最大区别是“多带体系结构(MGA)”,其“长的读事务不会堵塞写事务”的特性使得Firebird在相同的硬件条件下性能优于传统“加锁事务”机制的数据库。我们经常看到许多使用了商业数据库的大型应用系统,为了提高系统性能和并发度,往往采用两台数据库服务器,一台为主业务数据库,另一台为查询数据库,这种情况在Firebird身上是不会发生的。在企业级的中端市场,同其他商业数据库相比,Firebird具有极强的综合竞争力;在低端嵌入式市场,其地位是DB2、Oracle、Sybase所无法撼动的。唯有高端大型主机集群领域,Firebird现在还底气不足。

  Firebird的前身Interbase在全球拥有数百万商业用户,驰骋疆场15载,是一个成熟稳定的企业级产品,这一点是其它开源关系数据库(PostGreSql、MySQL、BerkelyDB等)所不能比的。

总结

  Firebird历经重重艰难险阻,现在终能昂首自由飞翔。在全世界开源自由爱好者的推动下,Firebird六年来飞速发展。作为一个成熟的企业级商业关系数据库的后代,Firebird可应用于各种领域,胜任关键性任务。其独创的“多代版本体系”使得系统短小精悍,高效健壮。各种完备的开发接口技术,适合各种开发环境。然而,目前Firebird在中国没有流行开来,这和开源软件没有进行商业广告宣传有很大的关系。我免费使用Firebird多年,未对其作出多大贡献,本文就算是一种补偿吧。愿国内同行积极评估、使用Firebird,提高产品的竞争力;有能力者加入Firebird开发团队,锦上添花。Firebird 3.0发布后,Jim Starkey会在Firebird中嵌入Java虚拟机来支持触发器、存储过程、用户自定义函数。可以预见,在Jim Starkey的领导下,未来的Firebird会越飞越高。

10
Aug
0

firebird常用系统语句

--得到数据库的所有者名称
SELECT distinct RDB$OWNER_NAME AS DATABASE_OWNER
FROM RDB$RELATIONS
WHERE (RDB$SYSTEM_FLAG = 1);

--根据表名得到表的主键
SELECT RC.RDB$CONSTRAINT_NAME AS CONSTRAINT_NAME,
I.RDB$RELATION_NAME AS TABLE_NAME,
S.RDB$FIELD_NAME AS COLUMN_NAME
FROM RDB$RELATION_CONSTRAINTS RC
LEFT JOIN RDB$INDICES I ON
(I.RDB$INDEX_NAME = RC.RDB$INDEX_NAME)
LEFT JOIN RDB$INDEX_SEGMENTS S ON
(S.RDB$INDEX_NAME = I.RDB$INDEX_NAME)
WHERE (RC.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY')
AND (I.RDB$RELATION_NAME = 'COUNTRY')

---根据表名得到其相关的依赖.
SELECT RDB$DEPENDENT_NAME AS DEPENDENT_NAME,
RDB$DEPENDED_ON_NAME AS DEPENDS_ON,
RDB$FIELD_NAME AS FIELD_NAME,
RDB$DEPENDENT_TYPE DEPENDENT_TYPE,
CASE

WHEN RDB$DEPENDENT_TYPE = 0 THEN 'TABLE'
WHEN RDB$DEPENDENT_TYPE = 1 THEN 'VIEW'
WHEN RDB$DEPENDENT_TYPE = 2 THEN 'TRIGGER'
WHEN RDB$DEPENDENT_TYPE = 3 THEN 'COMPUTED'
WHEN RDB$DEPENDENT_TYPE = 4 THEN 'VALIDATION'
WHEN RDB$DEPENDENT_TYPE = 5 THEN 'PROCEDURE'
WHEN RDB$DEPENDENT_TYPE = 6 THEN 'expression_r_INDEX'
WHEN RDB$DEPENDENT_TYPE = 7 THEN 'EXCEPTION'
WHEN RDB$DEPENDENT_TYPE = 8 THEN 'USER'
WHEN RDB$DEPENDENT_TYPE = 9 THEN 'FIELD'
WHEN RDB$DEPENDENT_TYPE = 10 THEN 'INDEX'
WHEN RDB$DEPENDENT_TYPE = 14 THEN 'GENERATOR'
ELSE 'UNKNOWN'
END AS DEPENDENT_TYPE_STR,

RDB$DEPENDED_ON_TYPE AS DEPEND_ON_TYPE,
CASE

WHEN RDB$DEPENDED_ON_TYPE = 0 THEN 'TABLE'
WHEN RDB$DEPENDED_ON_TYPE = 1 THEN 'VIEW'
WHEN RDB$DEPENDED_ON_TYPE = 2 THEN 'TRIGGER'
WHEN RDB$DEPENDED_ON_TYPE = 3 THEN 'COMPUTED'
WHEN RDB$DEPENDED_ON_TYPE = 4 THEN 'VALIDATION'
WHEN RDB$DEPENDED_ON_TYPE = 5 THEN 'PROCEDURE'
WHEN RDB$DEPENDED_ON_TYPE = 6 THEN 'expression_r_INDEX'
WHEN RDB$DEPENDED_ON_TYPE = 7 THEN 'EXCEPTION'
WHEN RDB$DEPENDED_ON_TYPE = 8 THEN 'USER'
WHEN RDB$DEPENDED_ON_TYPE = 9 THEN 'FIELD'
WHEN RDB$DEPENDED_ON_TYPE = 10 THEN 'INDEX'
WHEN RDB$DEPENDED_ON_TYPE = 14 THEN 'GENERATOR'
ELSE 'UNKNOWN'
END AS DEPENDS_ON_TYPE_STR

FROM RDB$DEPENDENCIES WHERE RDB$DEPENDED_ON_NAME='JOB'
ORDER BY RDB$DEPENDENT_NAME

--根据索引名得到表名和与及其索引相关的列
SELECT I.RDB$RELATION_NAME AS TABLENAME,
S.RDB$FIELD_NAME AS FIELDNAME
FROM RDB$INDICES I
LEFT JOIN RDB$INDEX_SEGMENTS S ON
(S.RDB$INDEX_NAME = I.RDB$INDEX_NAME)
WHERE (I.RDB$INDEX_NAME = 'NAMEX');

--根据表名得到其上所有的索引
SELECT I.RDB$INDEX_NAME AS FKINDEXNAME,
I.RDB$RELATION_NAME AS TABLENAME,
S.RDB$FIELD_NAME AS FIELDNAME
FROM RDB$INDICES I
LEFT JOIN RDB$INDEX_SEGMENTS S ON (S.RDB$INDEX_NAME = I.RDB$INDEX_NAME)
WHERE I.RDB$RELATION_NAME = 'CUSTOMER'
AND (NOT EXISTS(SELECT 1
FROM RDB$RELATION_CONSTRAINTS R WHERE R.RDB$INDEX_NAME = I.RDB$INDEX_NAME))

--得到所有的用户表
SELECT RDB$RELATION_NAME AS TABLE_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG = 0
AND RDB$VIEW_SOURCE IS NULL;

--根据表名与字段得到索引
SELECT I.RDB$INDEX_NAME AS FKINDEXNAME,
I.RDB$RELATION_NAME AS TABLENAME,
S.RDB$FIELD_NAME AS FIELDNAME
FROM RDB$INDICES I
LEFT JOIN RDB$INDEX_SEGMENTS S ON (S.RDB$INDEX_NAME = I.RDB$INDEX_NAME)
WHERE I.RDB$FOREIGN_KEY IS NOT NULL
AND I.RDB$RELATION_NAME = 'CUSTOMER'
AND S.RDB$FIELD_NAME = 'COUNTRY';

--根据表名得到列信息
SELECT RF.RDB$FIELD_NAME AS FieldName,
T.RDB$TYPE_NAME AS DataType,
F.RDB$FIELD_LENGTH AS FieldLength,
RF.RDB$NULL_FLAG AS AllowNulls,
CS.RDB$DEFAULT_COLLATE_NAME AS CharacterSet,
RF.RDB$DEFAULT_SOURCE AS Defaultvalue,
F.RDB$COMPUTED_SOURCE AS ComputedSource,
F.RDB$FIELD_SUB_TYPE AS SubType,
F.RDB$FIELD_PRECISION AS FieldPrecision
FROM RDB$RELATION_FIELDS RF
LEFT JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE)
LEFT JOIN RDB$TYPES T ON (T.RDB$TYPE = F.RDB$FIELD_TYPE)
LEFT JOIN RDB$CHARACTER_SETS CS ON (CS.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID)
WHERE RF.RDB$RELATION_NAME = 'EMPLOYEE' AND
T.RDB$FIELD_NAME = 'RDB$FIELD_TYPE'
ORDER BY RF.RDB$FIELD_POSITION;

--检测一个列是否存在,结果为1存在,不为1不存在
SELECT COUNT(RF.RDB$FIELD_NAME)
FROM RDB$RELATION_FIELDS RF
LEFT JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE)
LEFT JOIN RDB$TYPES T ON (T.RDB$TYPE = F.RDB$FIELD_TYPE)
WHERE RF.RDB$RELATION_NAME = 'EMPLOYEE' AND
T.RDB$FIELD_NAME = 'RDB$FIELD_TYPE' AND
RF.RDB$FIELD_NAME = 'EMP_NO'

--检测一个表是否存在
SELECT COUNT(RDB$RELATION_NAME)
FROM RDB$RELATIONS
WHERE (RDB$RELATION_NAME = 'CUSTOMER')

AND RDB$VIEW_SOURCE IS NULL; 

或者

SELECT RDB$RELATION_NAME, RDB$OWNER_NAME FROM RDB$RELATIONS where (RDB$RELATION_NAME='表名') 注意表名大小写!

--得到数据库中所有的视图
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$FLAGS = 1
AND RDB$VIEW_SOURCE IS NOT NULL;

--得到所有的系统表
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE (RDB$FLAGS = 0 OR RDB$FLAGS IS NULL)
AND RDB$VIEW_SOURCE IS NULL;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sonnydica/archive/2010/03/18/5392922.aspx

select name from sysobjects where xtype= 'U '
得到所有用户表的表名

select 表名=name from sysobjects where objectproperty(id, 'isusertable ')=1
获取SQL所有数据库名、所有表名、所有字段名、表字段长度[转]
1.获取所有数据库名:
Select Name FROM Master..SysDatabases orDER BY Name
2.获取所有表名:
Select Name FROM DatabaseName..SysObjects Where XType='U' orDER BY Name
XType='U':表示所有用户表;
XType='S':表示所有系统表;
3.获取所有字段名:
Select Name FROM SysColumns Where id=Object_Id('TableName')
4、表字段的长度
select
table_name ,
column_name,
isnull(column_default,'') default_value,
is_nullable,
data_type,
isnull(isnull(isnull(character_maximum_length,numeric_precision),datetime_precision),1) length
from information_schema.columns
where not table_name in('sysdiagrams','dtproperties')

10
Aug
0

Firebird/InterBase内置函数使用说明

Firebird/InterBase内置函数使用说明
2008-09-20 09:22
  加*号为FB2.0加入的函数
整理:剑雷(jianlei) 2006-10-13

  1. COUNT, AVG, MAX, MIN, SUM
    说明:通用统计函数,不详细介绍了
  2. EXTRACT(timestamp_part FROM value)
    说明:EXTRACT(YEAR/MONTHE/DAY/WEEKDAY FROM 字段名)

从日期型字段中分离出年,月,日及一个星期的第几天

  1. CAST(value AS datatype)
    说明:转换数据类型
  2. LOWER() *
    说明:返回小写值
  3. UPPER()
    说明:返回大写值
  4. TRIM() *
    说明:去除字符串两边的空格
  5. SUBSTRING(string FROM pos FOR length)
    说明:取字符串子串,注意,第一个字符的位置是1
  6. BIT_LENGTH *
    说明:返回字符串位(bit)数
  7. CHAR_LENGTH/CHARACTER_LENGTH *
    说明:返回字符串字符数
  8. OCTET_LENGTH *
    说明:返回字符串字节数
  9. CASE
    说明:通过执行外来的一组条件取得相应的返回值

举例
i) 简单
SELECT o.ID, o.Description,
CASE o.Status
WHEN 1 THEN 'confirmed'
WHEN 2 THEN 'in production'
WHEN 3 THEN 'ready'
WHEN 4 THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM Orders o;
ii) 表达式
SELECT o.ID, o.Description,
CASE
WHEN (o.Status IS NULL) THEN 'new'
WHEN (o.Status = 1) THEN 'confirmed'
WHEN (o.Status = 3) THEN 'in production'
WHEN (o.Status = 4) THEN 'ready'
WHEN (o.Status = 5) THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM Orders o;

  1. IIF (<search_condition>, <value1>, <value2>)
    说明:表达式为真,返回value1否则返回value2

等价于以下语句:
CASE
WHEN <search_condition> THEN <value1>
ELSE <value2>
END

  1. NULLIF(V1,V2)
    说明:如果V1=V2,返回NULL,否则返回V1

等价于以下语句:
CASE WHEN V1 = V2 THEN NULL ELSE V1 END
举例
UPDATE PRODUCTS
SET STOCK = NULLIF(STOCK,0)

  1. COALESCE(V1, V2, …, Vn)
    说明:如果V1为Null,返回V2,否则返回V1,

如果 n >= 3, 等于如下case语句:
CASE
WHEN V1 IS NOT NULL THEN V1
ELSE COALESCE (V2,...,Vn)
END

举例
SELECT
PROJ_NAME AS Projectname,
COALESCE(e.FULL_NAME,'[< not assigned >]') AS Employeename
FROM
PROJECT p
LEFT JOIN EMPLOYEE e
ON (e.EMP_NO = p.TEAM_LEADER);

SELECT
COALESCE(Phone,MobilePhone,'Unknown') AS "Phonenumber"
FROM Relations;
15.获当前日期:
select current_date from rdb$database
获当前时间:
select current_time from rdb$database
16.Firebird数据库的取值范围
在其它SQL数据库里,有一个 Top n的子句,可以取头n条记录,Firebird不支持这个子句,但是它有更强大的子句:FIREST n SKIP n。
FIRST n表示提取头n条记录,SKIP n 表示从第几条开始提取,比如,我要从学生表里取语文成绩名次在11至15名的学生名单,SQL语句如下:
select first 5 skip 10 SNAME,YUWEN from achieve order by YUWEN desc
一、分页写法小例:
SELECT FIRST 10 templateid,code,name FROM template ;
SELECT FIRST 10 SKIP 10 templateid,code,name FROM template ;
SELECT * FROM shop ROWS 1 TO 10; --firebird2.0支持这种写法

二、显示表名和表结构
  SHOW TABLES;
SHOW TABLE tablename;
三、使用ISQL连接数据库
firebird%92bin>isql -u sysdba -p masterkey
SQL>CONNECT 'E:companyxmwsoftnewxmwsoftc2dbcts2.fdb';

SQL>CONNECT 'E:%92'
CON>USER 'sysdba'
CONT>PASSWORD 'masterkey';

四、更新字段注释
UPDATE RDB$RELATION_FIELDS
SET RDB$DESCRIPTION = '描述信息'
WHERE (RDB$RELATION_NAME = 'SHOP')
AND (RDB$FIELD_NAME = 'CREDIT_BUY')

五、显示字段注释
SELECT RDB$FIELD_NAME,RDB$DESCRIPTION
FROM RDB$RELATION_FIELDS
WHERE (RDB$RELATION_NAME = 'SHOP')
AND (DB$FIELD_NAME = 'CREDIT_BUY')

六、更新表注释
UPDATE RDB$RELATIONS
SET RDB$DESCRIPTION = '描述信息'
WHERE RDB$RELATION_NAME = 'TABLE_NAME';

七、查询所有的表和视图(包括系统表和系统视图)
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS;

八、查询所有的用户表和用户视图
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG = 0;

九、查询所有的用户表
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG = 0

AND RDB$VIEW_BLR IS NULL;

十、查所有用户表、用户视图所有字段及相关定义
SELECT
a.RDB$RELATION_NAME,
b.RDB$FIELD_NAME,
b.RDB$FIELD_ID,
d.RDB$TYPE_NAME,

c.RDB$FIELD_LENGTH,

c.RDB$FIELD_SCALE
FROM RDB$RELATIONS a

INNER JOIN RDB$RELATION_FIELDS b
ON a.RDB$RELATION_NAME = b.RDB$RELATION_NAME

INNER JOIN RDB$FIELDS c
ON b.RDB$FIELD_SOURCE = c.RDB$FIELD_NAME
INNER JOIN RDB$TYPES d

  ON c.RDB$FIELD_TYPE = d.RDB$TYPE

WHERE a.RDB$SYSTEM_FLAG = 0
AND d.RDB$FIELD_NAME = 'RDB$FIELD_TYPE'
ORDER BY a.RDB$RELATION_NAME, b.RDB$FIELD_ID;

十一、查找某表的所有字段及相关定义
SELECT
A.RDB$FIELD_NAME,
B.RDB$FIELD_TYPE,
B.RDB$FIELD_LENGTH,
B.RDB$FIELD_PRECISION,
B.RDB$FIELD_SCALE
FROM RDB$RELATION_FIELDS A, RDB$FIELDS B
WHERE A.RDB$RELATION_NAME = 'tablename'
AND A.RDB$FIELD_SOURCE = B.RDB$FIELD_NAME
ORDER BY A.RDB$FIELD_POSITION;

十二、查找某表的主键定义字段
SELECT A.RDB$FIELD_NAME
FROM RDB$INDEX_SEGMENTS A, RDB$RELATION_CONSTRAINTS B
WHERE B.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND B.RDB$RELATION_NAME = 'tablename'

AND A.RDB$INDEX_NAME = B.RDB$INDEX_NAME

ORDER BY A.RDB$FIELD_POSITION;

十三、查找某表的外键定义
SELECT
r1.RDB$CONSTRAINT_NAME,
rind.RDB$FIELD_NAME,
r2.RDB$RELATION_NAME
FROM
RDB$RELATION_CONSTRAINTS r1,
RDB$RELATION_CONSTRAINTS r2,

RDB$REF_CONSTRAINTS ref,

RDB$INDEX_SEGMENTS rind
WHERE r1.RDB$RELATION_NAME = 'tablename'
AND r1.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'

AND r1.RDB$CONSTRAINT_NAME = ref.RDB$CONSTRAINT_NAME

AND ref.RDB$CONST_NAME_UQ = r2.RDB$CONSTRAINT_NAME

AND r1.RDB$INDEX_NAME = rind.RDB$INDEX_NAME;