firebird database (快速入门) 简体版
参考文件(均可自firebird网站找到):
Novice's Guide
Migration from MS-SQL to firebird
Firebord Release Notes
- 学习资料库基础是在sql的语法应用(请参考: firebird网站的说明文件 最好把这份文件印出来,在写程式时可以参考其语,虽然大部份都是sql-92相容,但是有差异,还有一些专有的语法)
- 当你需要的资料找不到时可以找寻interbase的相关资料(因为firebird是由interbase释放原始码所衍生的)
- 有一本网路上完整的书"BORLAND INTERBASE7.0 应用开发指南(姚启红着)",虽然是interbase但非常详细,要深入了解(建议必读)
目录索引
- 前言
- 程式架构
- 下载及安装
- 设定
- 使用者管理(console)
- 资料库管理(console)
- 连线方式(档案/tcpip)
- 资料库/使用者管理(gui)
- 设定ODBC
- 资料库安全(备份/回存)(console)
- 资料库安全(备份/回存)(gui)
- 资料型态
- 使用者自定函式(UDF)
前言
它是Borland之前推出interbase资料库,并将其开放原始码的免费资料库软体,目前版本是1.5.2,它比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等...)
- Super Server -无法直接存取资料库档案,必须透过socket来和伺服器沟通
- Classic- 直接存取资料库的档案,多个程式可以同时存取一个档案,有点像vfp,dbase
- 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命令
options
范例
有两种方式
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( abcd)使用tcp port 3050
gsec -user sysdba -password masterkey -database abcd/3050:"c:\program files\firebird\firebird_1_5\security.fdb -modiyf sysdba -pw londo
删除本地使用者
gsec -user sysdba -password masterkey -delete joe
di[splay] |
显示所有使用者 |
di[splay] <username> |
显示某使用者 |
a[dd] <username> -pw <password> [options] |
新增使用者 |
mo[dify] <username> [options] |
修改使用者 |
de[lete] <username> |
删除使用者 |
h[elp] |
求助 |
? |
同上 |
q[uit] |
离开gsec |
z |
显示版本 |
-pa[ssword] <password> |
管理者的密码 |
-user <username> |
使用者名称 |
-pw <password> |
使用者密码 |
-fname <first name> |
英文名字有,三个部份 |
-mname <middle name> |
|
-lname <last name> |
资料库管理(console)
程式isql位于安装目录下的bin
以下是一个操作范例:
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
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>变为CON>,告诉你延续之前的命令
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);
每一个资料库有一个特殊资料库- 系统资料库 ,包含了使用者权限等...
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+ :非常容易管理,必须有资料库的观念
另外可配合 marathon 使用
ibeasy+使用者管理介面:
server->users management
![](http://csc.ocean-pioneer.com/docum/firebird/user_man1.png)
(输入管理者的名称及密码,进入下一个视窗)
![](http://csc.ocean-pioneer.com/docum/firebird/user_man2.png)
(你就可以管理你的使用者)
设定odbc
在firebird->download ->odbc
下载后安装
odbc
![odbc picture](http://csc.ocean-pioneer.com/docum/firebird/friebird_odbc.png)
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 -yc:\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 转换外部档案到内部表格.
![resotre database](http://csc.ocean-pioneer.com/docum/firebird/restore_db.png)
执行这个操作,必须是这个资料库的拥有者或是有执行管理系统的权限: 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无关。 |
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) |
文字,类似memo,而资料型态varchar限制32K 二位元资料(图片,影音档等)
|
generator(计数器)
计数器可以我们帮助产生循序的数字,你可以将其看成如一个公共变数,使用gen_id(generator名称,step)来取得一个值并加step
create generator my_gen
num=gen_id(my_gen,1)
则
num
问题
如果纯粹使用generator来填入,如果是uniqe或primary key,当generator最大值是2 64 (18446744073709551616)如果超过会重回到0
由于generator的最大值2 64 是很大数字要产生重复的机率很小
要不要使用日期来配合产生?
如果配合日期则会产生重复的机率会减少(发票,传票等)
年月日+流水号
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指令时自动引用)
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 ; !!
在insert的执行前,所有的插入到被触发的表格的栏位,你可以使用new.栏位名称来存取,只要变更该值就可以自动变更新增到表格中的栏位值
#在建立trigger 时由于trigger中的;(分号)会混淆结束符号,因此使用sql指令或在isql中新增trigger请变更其结尾符号,是set term 结尾符号,预设的结尾符号";" ,因此做完要复原set term ;!!
流水号
每日重置流水号
使用表格栏位来记录日期,检查若日期不同则写入新日期并将generator归零(set generator 名称to 0),但无法使用在储存函式中
在新增之前触发这个功能,比上述更简单(尚未测试)
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
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的动作,则会重建索引,当然只有在没有人使用该资料库时才可以使用