Novice's GuideMigration from MS-SQL to firebird Firebord Release Notes


  1. 学习数据库基础是在sql的语法应用(请参考:​​firebird 网站的说明文件​​最好把这份文件印出来,在写程序时可以参考其语,虽然大部份都是sql-92兼容,但是有差异,还有一些专有的语法)
  2. 当你需要的资料找不到时可以找寻interbase的相关资料(因为firebird是由 interbase释放原始码所衍生的)
  3. 有一本电子书《INTERBASE7.0 应用开发指南 ,姚启红》可以下载到,还有一本电子工业出版社任颂华(也就是论坛上的TR)写的《基于InterBase的数据库开发》,李维作序。两本侧重点不同,虽然都是interbase,但也99%兼通FB,建议必读 。




前言

它是Borland之前推出interbase数据库,并将其开放原始码的免费数据库软件,目前版本是1.5.4,它比mysql, postgresql 更适合于windows操作系统,它并不是使用cygwin的方式移植到windows上,而是真正的windows软件,我们一般将其比较于Ms- sql server,是一个小而美数据库,最大的优点在于它是免费的(ms-sql server五人版至将近三万元),其实它也支持不同作业平台(含inux),对于linux上我还是建议大家postgresql或是mysql

因为firebird若要用php的话就有点难了...,你要根据网站文件来作一些修改编译的动作

#日前postgresql 8.0释放已经支持windwos的原始档(不使用cygwin来执行),但很可惜不支持98/me

因目前还是有人使用win98单机使用的数据库,如果你单机上使用nt系统(2000/xp)等可以使用postgresql,因为postgresql 比起firebird来讲某方面确实比较强,而使用者也比较多



架构

firebird 数据库软件有三种套件,并而支持不同作业平台(windows系列,linux,freebsd等...)

  1. Super Server-无法直接存取数据库档案,必须透过socket来和服务器沟通
  2. Classic-直接存取数据库的档案,多个程序可以同时存取一个档案,有点像vfp,dbase
  3. embedded-专为一些小型系统的嵌入式数据库 (pda)


下载及安装

主网站:​​http://firebird.sourceforge.net/​

Download->Firebird relational database

直接点两下就可以安装,请照步骤,根据自己的需求来安装

预设安装路径

windows:c:\program files\firebird\firebird_1_5

linux:/opt/firebird 

两个操作系统下的目录结构非常像

根目录下:

firebird.conf-设定档 

aliases.conf  -别名档

friebird.log -记录文件

SYSDBA.password -linux才有,管理者的名称及密码在里面,windows则预设:名称:sysdba,密码:masterkey

windows直接使用security.fdb来存sysdba的密码

注意:使用者名称不分大小写,但密码有分

目录/bin:

则是一些必要的主要及工具程序



设定 firebird 

主要的设定档

firebird.conf 

预设tcp/ip会启动port:3050

你可以使用telnet ip 3050来测试

aliases.conf

设定数据库的别名

数据库联机时一般要指定路径,有时路径太长时你可以指定,在aliases.conf中使用别名来存取

它是位于你安装firebird的根目录,以下为内建范例

# 别名 =  原始路径

employee.fdb = /opt/firebird/examples/employee.fdb

 

其中#为批注,而windows及linux的路径是有所不同:

# fbdb1 在Windows服务器:

fbdb1 = c:\Firebird\sample\Employee.fdb

# fbdb2 在Linux服务器:

fbdb2 = /opt/databases/killergames.fdb

数据库执行时可以编辑这个档案,不需要重新启动服务器

联机别名的方式:

Server_name:aliasname



使用者管理(consloe接口)

1.预设管理者名称sysdba,密码masterkey

2.密码文件security.fdb,位于firebird安装目录下

3.管理程序gsec 

   安装目录下\bin

4.密码长度限制在8码

用法:

本地主机(数据库server在本台计算机)

gsec -user sysdba -password <password> [options]

远程主机(数据库server在别台计算机)

gsec -user sysdba -password <password> -database <databasename>


gsec命令


di[splay]



显示所有使用者



di[splay] <username>



显示某使用者



a[dd] <username> -pw <password> [options]



新增使用者



mo[dify] <username> [options]



修改使用者



de[lete] <username>



删除使用者



h[elp]



求助



?



同上



q[uit]



离开gsec



z



显示版本


options


-pa[ssword] <password>



管理者的密码



-user <username>



使用者名称



-pw <password>



使用者密码



-fname <first name>



英文名字有,三个部份



-mname <middle name>



 



-lname <last name>



 


范例

有两种方式

1.直接下在命令列-

2.进入交互式的命令列-额外的命令

新增使用者

gsec -user sysdba -password masterkey 

gsec> add elvis -pw elvis -fname elvis -lnmae presley 

修改密码

gsec> modify elvis -pw chunk 

修改sysdba密码

gsec -user sysdba -password masterkey -modify sysdba -pw mykey37

修改远程服务器linux的sysdba密码

gsec -user sysdba -password masterkey -database harry:/opt/firebird/security.fbd -modify sysdba -pw hamburg 

修改远程服务器windows的sysdba密码

gsec -user sysdba -password masterkey -database sally:"c:\Program files\Firebird\security.fdb" -modify sysdba -pw hannover

修改远程服务器使用tcp port 3050

gsec -user sysdba -password masterkey -database jack/3050:/opt/firebird/security.fdb" -modify sysdba -pw londo

修改远程windows服务器ip( a.b.c.d)使用tcp  port 3050 

gsec -user sysdba -password masterkey -database a.b.c.d/3050:"c:\program files\firebird\firebird_1_5\security.fdb  -modiyf sysdba -pw londo 

删除本地使用者

gsec -user sysdba -password masterkey -delete joe



数据库管理(console)

程序isql位于安装目录下的bin

以下是一个操作范例:



c:\Program files\firebird\firebird_1_5\bin\>isql -user sysdba -password masterkey 

Use CONNECT or CREATE DATABASE to specify a database

SQL> connect test;

Database:  test, User: sysdba

SQL> show table;

       COUNTRY                                CUSTOMER

       DEPARTMENT                             EMPLOYEE

       EMPLOYEE_PROJECT                       JOB

       PHONE_LIST                             PROJECT

       PROJ_DEPT_BUDGET                       SALARY_HISTORY

       SALES

SQL> select * from country ;

COUNTRY         CURRENCY

=============== ==========

USA             Dollar

England         Pound

Canada          CdnDlr

SQL>quit;


建立数据库

1.建立数据库create database 

2.建立数据表格create table (sql指令)

3.删除资枓表格drop  table (sql指令)

4.查询数据库中所含表格 show table 

5.查询表格中的结构 show table 表格名称

6.新增,删除,更新(insert,delete,update)均为sql指令

7.SQL命令交付,在新增或删除时,数据库并未直接变更,要使用sql指命commit 或commit work来更新


isql -user sysdba -password masterkey



Use CONNECT or CREATE DATABASE to specify a database

SQL> create database 'c:\temp\test.fdb';

SQL> create table abc (name char(12),age numeric(3));

SQL> show table friend ;

FIRSTNAME                       CHAR(15) Nullable

LASTNAME                        CHAR(20) Nullable

CITY                            CHAR(15) Nullable

STATE                           CHAR(2) Nullable

AGE                             INTEGER Nullable


SQL> insert into abc (name ,age) values( 'cschen',34);

SQL> select * from abc;


NAME             AGE

============ =======

cschen            34


以上的操作主要是sql指令

命令的结尾必需使用";", 如果没有使用";"提示会由SQL>变为CON>,告诉你延续之前的命令



SQL>create table friend 

CON>(FIRSTNAME CHAR(13),

CON> LASTNAME CHAR(40),

CON> STATE CHAR(2),

CON> AGE INTEGER );

同下

SQL>create table friend (FIRSTNAME CHAR(13),LASTNAME CHAR(40),STATE CHAR(2),AGE INTEGER);


每一个数据库有一个特殊数据库-系统数据库,包含了使用者权限等...



SQL> show system;

       RDB$CHARACTER_SETS                     RDB$CHECK_CONSTRAINTS

       RDB$COLLATIONS                         RDB$DATABASE

       RDB$DEPENDENCIES                       RDB$EXCEPTIONS

       RDB$FIELDS                             RDB$FIELD_DIMENSIONS

      ..................                ..................


使用者权限

1.GRANT 授予使用者权限

  GRANT 权限 ON 对象 TO 对象 [with grant option]

2.REVOKE 撤消使用者权限

  REVOKE 权限 ON 对象 FROM 对象


权限:SELECT ,INSERT ,UPDATE,DELETE, ALL

物件:TABLE,VIEW

对象:使用者,PUBLIC(代表全部)

with grant option 让该名使用者有设定别的使用者的权限 

*因为isql无法输入中文,因此无法使用在中文输入数据

*在linux下由于可能会有同名的isql(unixODBC套件),而linux安装在/opt/firebird,因此必须使用绝对路径来执行,另数据库的管理者名称可以不固定,至于密码在安装时会自动产生在档案SYSDBA.password中



联机方式(档案/tcpip)

程序支持两种联机方式

1.使用完整路径联机

  c:\abcd.....

2.使用tcpip联机,在路径前加主机的名称或IP

   主机:c:\abcd....


我们可以根据切换这两种

windows 下的路径如有空白,有时必须使用" "将路径框起来才可以用



数据库/使用者管理(gui)

  

我有试过几个免费的windows端的软件 

选择​​ibeasy+​​: 容易管理,必须有数据库的观念;推荐​​FlameRobin​​,介绍:Firebird的好工具——FlameRobin

ibeasy+使用者管理接口:

server->users management


(输入管理者的名称及密码,进入下一个窗口)


(你就可以管理你的使用者)

IBExpert、EMS IBManager更强大,但都是商业软件。



设定odbc 

在firebird->download ->odbc

下载后安装

odbc 


Database 

1.完整路径-c:\database\abc.fdb

2.tcp/ip-ip:完整路径(127.0.0.1:c:\database\abc.fdb)



数据库的安全(备份/回存)(console)

GBAK:命令列工具,命令有两个状态,备份/回存(-b / -c)

语法 

gbak <options> -user <username> -password <password> <source> <destination> 

1.备份gbak -b  <source> 是你要备份的数据库来源, <destination>是备份的目的地档名.一般的延伸附檔名 是 .fbk .

只有SYSDBA 或是数据库的拥有者可以执行备份工作. 对于多个档案的数据库,只需指定第一个档案的名称来当数据库的名称. 

2.回存 

gbak -c  <source> 是先前备份的档案而<destination> 是数据库的名称



选项

(中括号内的是非必要,也就是命令可以使用中括号前的缩写,或是含中括号内为长参数)


参数



说明



功能



-b[ackup_database] 



备份



备份



-bu[ffers]



Set cache size for restored database



回存



-c[reate_database]



回存 (必要参数)



回存



-co[nvert]



转换外部表格到内部表格s



备份



-e[xpand]



建立一个非压缩的备份



备份



-fa[ctor] n



磁带机的区块系数



备份



-g[arbage collect]



备份时不清空已删除的数据



备份



-i[nactive]



所有的索引将回存为INACTIVE



回存



-ig[nore]



备份时不做checksum错误检查



备份



-k[ill]



在不建立定义备份中的shadows



回存



-l[imbo]



备份时忽略limbo transactions



备份



-m[etadata]



只备份数据表格的metadata (schema).不备份资料



备份



-mo[de] read_write 



回存一个 可读/写的数据库(预设)



回存



-mo[de] read_only



回存一个只读写数据库



回存



-n[o_validity]



不回存validity constraints.也就是回存数据不回存 constraints



回存



-nt



非兼容性的格式(只使用在相同作业平台,及firebird版本)



备份



-o[ne_at_a_time]



一次回存一个表格.你可以分别分次回存表格 



回存



-ol[d_descriptions]



旧的格式



备份



-p[age_size] <size>



设定page size of new database.
 <size> 可以是 1024, 2048, 4096, 8192.预设1024. 



回存



-pa[ssword] <password>



数据库的密码



 



-r[eplace_database]



回存在一个存在的数据库上.只能在拥有本数据库的使用者可以操作 
这是覆写,不要执行在使用中的数据库!



回存



-role <role>



使用某一群组(role )来联机



 



-se[rvice]  <hostname>:service_mgr



备份: 建立,使用服务管理.
回存: 回存,使用服务管理.



 



-t[ransportable]



建立可转移的备份(不同操作系统及firebird版本)



备份



-u[ser] <username>



数据库使用者的名字 



 



-use_[all_space]



正常,回存,数据库页会填满80% 
只读才会写回100%(因为不用预留修改的空间)



回存



-v[erbose]



显示所有gbak执行的详细动作 



 



-y <filename>



重导所有的输出到一个档案 <filename>.
注意:命令执行之前不可以存在档名! 



 



-y suppress_output



Quiet mode 



 



-z



显示版本



 


范例:

正常的备份:

gbak -v -t -user SYSDBA -password "masterkey" dbserver:/db/warehouse.fdb c:\backups\warehouse.fbk

备份并记录所有备份时的输出讯息:

gbak -v -t -user SYSDBA -password masterkey -y c:\backups\warehouse.log dbserver:/db/warehouse.fdb c:\backups\warehouse.fbk

正常的回存:

gbak -c -v -user SYSDBA -password masterkey c:\backups\warehouse.fbk dbserver:/db/warehouse2.fdb

回存到一个已存在的数据库:

gbak -c -r -v -user SYSDBA -password masterkey c:\backups\warehouse.fbk dbserver:/db/warehouse.fdb

回存一个只读的数据库:

gbak -c -v -mode read_only -use_all_space -user SYSDBA -password masterkey c:\backups\warehouse.fbk c:\files\warehousedb.fdb

多重档案备份当数据库很大时,要备份有点困难,因此我们将数据库备份成许多小的档案,如此储存时比较方便

备份语法:

gbak [options] <database> <target file 1> <size 1> <target file 2> <size 2> ... <target file n>

注意: 不要指定最后一个档案的大小.因我们不一定知道最后一个档案需要多少空间来储存,所以它将自动依据大小来储存.至于其它档案的大小可以是 bytes (8192), kilbytes (1024k), megabytes (5m), 或 gigabytes (2g)

回存语法:

gbak -c [options] <source file 1> <source file 2> ... <source file n> <database>

回存到一个多个档案的数据库

有些系统的档案系统有限制,或是为了效能的因素,因此单一数据库,可分成多个小的数据库

gbak -c [options] <source file> <db file 1> <size 1> <db file 2> <size 2> ... <db file n>

注意:不要指定最后数据库的大小.它可以无限制的依据回存的档案来变更大小.

Size can be given in bytes (8192), kilbytes (1024k), megabytes (5m), or gigabytes (2g)

由备份多个档案回存到多个档案的数据库:

gbak -c [options] <source file 1> <source file 2> ... <source file n> <db file 1> <size 1> <db file 2> <size 2> ... <db file n>



数据库安全(备份/ 回存)(gui)

(ibeasy+,参考hlp檔)

选项 (Database | Save Database)

你可以简单复制数据库文件(如一般的指令copy) 但是无法确定数据库的安全.

优点:

  • 改善效能经由排除不完整的(eliminating incomplete)交易和过期的记录
  • 减少数据库的大小-移除删除的记录
  • 独立的备份和回存的功能和操作系统无关

执行时必要参数:

  •  数据库全名
  • 备份文件的名称,可包含大小等特性.
  • The options which must be applied at the time of back up
    Checksums 检查数据的完整. 
    End transactions 
    Metadata only 只存结构不存数据. 
    Eliminate garbage 予许释放旧版本记录的空间. 
    Old data format
    Transportable database 可以回存数据库到不同的操作系统. 
    Convert to tables 转换外部档案到内部表格.

选项: (Database | Restore Database)

执行这个操作,必须是这个数据库的拥有者或是有执行管理系统的权限: SYSDBA.

一个数据备份的数据库可以回存

执行时必要参数:

  • 备份文件的名称
  • 数据库全名
  • 可用的参数 
    Page size 变更数据库每页的大小,可以改善效能.说实在,所有数据库在一页中会比较快.
    Rebuild Indices.  重建索引
    Create database image Allow the recovery of a database in case of disk crash. 
    Validity conditions Allow when data are not valid any more, following for example a modification of the integrity constraints, to be unaware of the integrity constraints. 
    Commit after each table 
    Replace database In this case, the database must be closed beforehand, and no user must be connected. 
    Create a new database This option is exclusive compared to the preceding option 
    Use all space to recreate the database. By default, at the time of the restoration of a database, the pages are filled out to 80%. This option makes it possible to fill them to 100%.


数据型态


名称



大小



范围 /精度



描述



Blob



不固定



blob段大小限于64K



动态变长度二进制类型,用于存放大量数据的情况,如图片、音乐、视频、多媒体等。其基本结构单位为段,它的子类型描述了存储数据的详细信息



Boolean



16位



True
False
Unkown



代表了逻辑上的(真、假、不确定)与Dialect无关。 (IB7以后支持,FB暂不支持!)



Char(N)



n个字符



1到32767个字节。双字符集除2



固定长度的字符或字符串



Date



64位



从公元后100年一月一日到32768年二月29日



日期类型。只有年月日,不带时间



Decimal(P,S)



变数(16、32或64位)



精度p从1到18:指定数字的总长度;标度s从0到18:指定小数点后的位数。



定点小数。例如decimal(5,3)可以存储的数字形式为:pp.sss



Double Precision



64位



从2.225×10的-308 次方
到1.797×10的308次方



IEEE双精度浮点数,15位长度



Float



32位



从1.175×10的-38 次方
到3.402×0的38次方



IEEE单精度浮点数,7位长度



Integer



32位



从-2147483648
到2147483647



整数



Numeric(P,S)



变长(16、32或64位)



精度p从1到18:指定数字的总长度;标度s从0到18:指定小数点后的位数。



定点小数。例如decimal(10,3)可以存储的数字形式为:ppppppp.sss



Smallint



16位



从-32768到32767



短整数



Time



64位



从0:00 AM到23:59.9999 PM



时间类型



Timestamp



64位



从公元后100年一月一日到32768年二月29日



带有时间的日期类型



Varchar(N)



n个字符



1到32767个字节。字符集决定了其能容纳的最大字符数



 


#Blob

blob sub_type segment 

这是一个特有的数据型态,是用于储存比较大量的数据,类似其它数据库的text或是memo数据型态,在定义时有两个附加参数是sub_type, segment

sub_type是blob的数据类型,以下是它的types.h中的定义


定义



说明



​TYPE ("TEXT", 1,nam_f_sub_type)​TYPE ("BLR", 2,nam_f_sub_type)
TYPE ("ACL", 3,nam_f_sub_type)
TYPE ("RANGES", 4,nam_f_sub_type)
TYPE ("SUMMARY", 5,nam_f_sub_type)
TYPE ("FORMAT", 6,nam_f_sub_type)
TYPE ("TRANSACTION_DESCRIPTION", 7,nam_f_sub_type)
TYPE ("EXTERNAL_FILE_DESCRIPTION", 8,nam_f_sub_type)



文字,类似memo,而数据型态varchar限制 32K
二位数据(图片,影音文件等)


1,2是我们常用的,其它的很少使用



generator(计数器)计数器可以我们帮助产生循序的数字,你可以将其看成如一个公共变量,使用gen_id(generator名称,step)来取得一个值并加step

create generator my_gen 

num=gen_id(my_gen,1)

num

问题

如果纯粹使用generator来填入,如果是uniqe或primary key,当generator最大值是264(18446744073709551616) 如果超过会重回到0

由于generator的最大值264 是很大数字要产生重复的机率很小

要不要使用日期来配合产生?

如果配合日期则会产生重复的机率会减少(发票,传票等)

年月日+流水号

20040303004

而generator 只要产生流水号,但是流水号每天都是从1开始,并且一般会限制数字的宽度如四位数或三位数

如此造成重复性会增加

目前数据库并无法处理这个问题,你必须自己设计一个表格来储存这个值,配合sql指令来取得最后的值

(建议:不要浪费时间在使用在数据库端的解决方法)

填入的字段要字符串或是数字?

如果是单独使用generator,最好是用数字的格式比较好

#注意:integer只有32位

范例: 

create generator test_gen ;

CREATE TABLE  test1 (serial_no char(3) not null primary key,name char(15));

建立触发来自动取得ID(new.字段名称 ,这个变量是可以被sql指令时自动引用)




set term !!;

create trigger test for test1 active before insert  

as

begin

   new.serial_no=cast(gen_id(test_gen,1) as char(3));

end 

!! 

set term ; !!



#针对本身字段变更方法:触发包含了三种sql指令及二种状态执行前/执行后

在insert的执行前,所有的插入到被触发的表格的字段,你可以使用 new.字段名称来存取,只要变更该值就可以自动变更新增到表格中的字段值

#在建立trigger 时由于trigger中的;(分号)会混淆结束符号,因此使用sql指令或在isql中新增trigger请变更其结尾符号,是set term 结尾符号,预设的结尾符号";",因此做完要复原set term ;!!

 

流水号

每日重置流水号

使用表格字段来记录日期,检查若日期不同则写入新日期并将generator归零(set generator 名称 to 0),但无法使用在储存函式中

在新增之前触发这个功能,比上述更简单(尚未测试)




create trigger test2 for test active before insert 

as 

declare variable temp_date    date;

declare variable serial_no    char(3);

begin

   if current_date==t_date then 

      #取得流水号 

      serial_no=cast(gen_id(generator名称,1) as char(3));

   else

      #将流水号置为0,使用相减

       =GEN_ID(My_Generator, -GEN_ID(My_Generator))

      #取得流水号

   endif   

end


#current_date

select current_date from rdb$database



储存函式或触发呼叫其它的储存函式

execute procedure 名称[(变量1,变量2....)] [RETURNING_VALUES [(变量1,变量2.....)]]

最简单的呼叫(不传值,也不传回值)直接执行 EXECUTE PROCEDURE 名称



测试函式的执行或 GENERATOR的结果

1.建立一个GENERATOR

CREATE GENERATOR TESTGEN

2.建立一个储存函式(只是将GENERATOR加一)

create procedure TEST 

as

DECLARE VARIABLE MY  FLOAT;

BEGIN

MY=GEN_ID("TESTGEN",1);

END

3.直接执行命令

EXECUTE TEST 

4.查询GENERATOR是不是变为2



变量

函数中自己声明的区域变量

1.直接引用-不需任何前置符号

2.用在sql语法中-必须前置:(冒号)

记录使用者

CURRENT_USER 和 CURRENT_ROLE

时间变量

current_time,current_date,current_timestamp



udf自定函数的内建函数

预设有内建函数放在在安装目录下的udf

中含有的函式信息在fbudf.sql、ib_udf.sql,但真正函式是在fbudf.dll、ib_udf.dll

在firebird中使用者自定函式,和其它的sql-server有很大的不同

在firebird中udf一般是以c或c++写成函式,然后编译成为模块

1.windows- .dll

2.linux -  .so 

再来将其放在安装目录的UDF目录下,一般会将其宣告文件放在同一目录下,如果不是放在预设的目录下,你必须在firebird的环境档中设定,但是会有安全的问题.

如果你不会也不想写自定函数,但是想要用别人写好的函数

要使用声明命令

declare external function 

其语法如下:

declare external function '名称'

传入的变量型态列表

returns 回传变量型态 FREE_IT

entry_point '函式名称' '模块名称';

如果你不知道有那些函数可以使用,可以参考UDF目录下的.sql

以下是完整抄自ib_udf.sql

DECLARE EXTERNAL FUNCTION ltrim 

    CSTRING(255)

    RETURNS CSTRING(255) FREE_IT

    ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';

你必须在isql联机数据库完毕后执行上述的命令(或其它管理程序),则该函式就会随数据库可以被呼叫使用,

FREE_IT是在函式传回值之后清掉所配置的内存.

个人认为目前client所提供的函式远多于server端,因此除非必要否则尽量使用client端的函式

#ibeasy++不提供UDF的管理

#marthon提供



安全性(建立多个数据库备份文件)

create shadow 

一旦使用上述命令则会建立一个同步的数据库在其它的储存设备上,这可以保障当数据库逻辑或实体的储存接口损坏时,有一个备份的数据库可以实时取代



重建索引

alter index 索引名称 inactive 

alter index 索引名称 active 

上述命令可以用在重建索引,或是数据库回存时想要加速其执行速度,不要回存时边回存边建立索引,先执行inactive则回存时索引会失去作用,等数据库回存完毕时再执行active的动作,则会重建索引,当然只有在没有人使用该数据库时才可以使用