FireBird Database (快速入门)

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

目录索引

 


前言
它是Borland之前推出interbase数据库,并将其开放原始码的免费数据库软件,目前版本是1.5.4,它比mysqlpostgresql 更适合于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
 
其中#为批注,windowslinux的路径是有所不同:
# 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
修改远程服务器linuxsysdba密码
gsec -user sysdba -password masterkey -database harry:/opt/firebird/security.fbd -modify sysdba -pw hamburg 
修改远程服务器windowssysdba密码
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服务器ipa.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 "masterkeydbserver:/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字符

132767个字节。双字符集除2

固定长度的字符或字符串

Date

64

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

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

Decimal(P,S)

变数(163264

精度p118:指定数字的总长度;标度s018:指定小数点后的位数。

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

Double Precision

64

2.225×10-308 次方
1.797×10308次方

IEEE双精度点数,15位长度

Float

32

1.175×10-38 次方
3.402×038次方

IEEE单精度点数,7位长度

Integer

32

-2147483648
2147483647

整数

Numeric(P,S)

变长(163264位)

精度p118:指定数字的总长度;标度s018:指定小数点后的位数。

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

Smallint

16

-3276832767

短整数

Time

64

000 AM2359.9999 PM

时间类型

Timestamp

64

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

带有时间的日期类型

Varchar(N)

n字符

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

 


#Blob
blob sub_type segment 
这是一个特有的数据型态,是用于储存比较大量的数据,类似其它数据库的text或是memo数据型态,在定义时有两个附加参数是sub_type, segment
sub_typeblob的数据类型,以下是它的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来填入,如果是uniqeprimary 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.sqlib_udf.sql,真正函式是在fbudf.dllib_udf.dll
firebird中使用者自定函式,和其它的sql-server有很大的不同
firebirdudf一般是以cc++写成函式,然后编译成为模块
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的动作,则会重建索引,当然只有在没有人使用该数据库时才可以使用

你可能感兴趣的:(database)